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,5 +1,6 @@
1
- require File.join(File.dirname(__FILE__), %w[spec_helper])
1
+ require "spec_helper"
2
2
  require 'ostruct'
3
+ require 'oauth'
3
4
 
4
5
  describe "ApiOperator" do
5
6
 
@@ -17,7 +18,7 @@ describe "ApiOperator" do
17
18
 
18
19
  end
19
20
 
20
- it "should create request URI based on api method and client configuration" do
21
+ it "should create http request uri based on api method and client configuration" do
21
22
 
22
23
  api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
23
24
 
@@ -25,26 +26,134 @@ describe "ApiOperator" do
25
26
 
26
27
  uri.kind_of?(URI).should == true
27
28
 
28
- uri.to_s.should =~ /http:\/\/base.api.url\/version\/api\/method\?oauth_consumer_key=oauth_consumer_key/
29
- uri.to_s.should =~ /\&param1=value/
30
- uri.to_s.should =~ /\&paramTwo=2/
29
+ uri.to_s.should =~ /http:\/\/base.api.url\/version\/api\/method/
30
+ uri.to_s.should =~ /[\?\&]param1=value/
31
+ uri.to_s.should =~ /[\?\&]paramTwo=2/
31
32
 
32
33
  end
33
34
 
34
- it "should make sure country is set before making request" do
35
- @client.stub!(:country).and_return("sk")
35
+ it "should URL encode parameters accourding to OAuth spec" do
36
36
 
37
- @stub_api_request.should_receive(:ensure_country_is_set).with("sk")
38
-
39
- @api_operator.call_api(@stub_api_request)
37
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "a+b@c.d", :paramTwo => "<a b>"})
38
+
39
+ uri = @api_operator.create_request_uri(api_request)
40
+
41
+ uri.to_s.should =~ /[\?\&]param1=a%2Bb%40c.d/
42
+ uri.to_s.should =~ /[\?\&]paramTwo=%3Ca%20b%3E/
40
43
 
41
44
  end
42
45
 
43
- it "should make HTTP request and get response" do
46
+ it "should create http GET request by default" do
44
47
 
45
- Net::HTTP.should_receive(:get_response).with(@api_operator.create_request_uri(@stub_api_request))
48
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
49
+
50
+ client, request = @api_operator.create_http_request(api_request)
46
51
 
47
- @api_operator.call_api(@stub_api_request)
52
+ request.class.should == Net::HTTP::Get
53
+
54
+ end
55
+
56
+ it "should create http POST request" do
57
+
58
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
59
+ api_request.http_method = :POST
60
+
61
+ client, request = @api_operator.create_http_request(api_request)
62
+
63
+ request.class.should == Net::HTTP::Post
64
+
65
+ end
66
+
67
+ it "should create http DELETE request" do
68
+
69
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
70
+ api_request.http_method = :DELETE
71
+
72
+ client, request = @api_operator.create_http_request(api_request)
73
+
74
+ request.class.should == Net::HTTP::Delete
75
+
76
+ end
77
+
78
+ it "should create http PUT request" do
79
+
80
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
81
+ api_request.http_method = :PUT
82
+
83
+ client, request = @api_operator.create_http_request(api_request)
84
+
85
+ request.class.should == Net::HTTP::Put
86
+
87
+ end
88
+
89
+ it "should have empty body if no form parameters provided" do
90
+
91
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
92
+
93
+ client, request = @api_operator.create_http_request(api_request)
94
+
95
+ request.instance_variable_get("@body").empty?.should == true
96
+
97
+ end
98
+
99
+ it "should set up any form parameters in body" do
100
+
101
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
102
+ api_request.form_parameters[:shop_id] = "1234"
103
+ api_request.form_parameters[:email] = "test@example.com"
104
+ api_request.form_parameters[:ignore] = nil
105
+
106
+ client, request = @api_operator.create_http_request(api_request)
107
+
108
+ request.instance_variable_get("@body").should == "shopId=1234&email=test%40example.com"
109
+
110
+ end
111
+
112
+ it "should create HTTPS request uri based on api method that requires secure connection and client configuration" do
113
+
114
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
115
+ api_request.require_secure_connection
116
+
117
+ uri = @api_operator.create_request_uri(api_request)
118
+
119
+ uri.kind_of?(URI).should == true
120
+
121
+ uri.to_s.should =~ /https:\/\/base.api.url\/version\/api\/method/
122
+ uri.to_s.should =~ /[\?\&]param1=value/
123
+ uri.to_s.should =~ /[\?\&]paramTwo=2/
124
+
125
+ end
126
+
127
+ it "should create http request uri based on api method for non standard api service" do
128
+
129
+ @client.should_receive(:api_host_and_version).with(:media).and_return(["media-base.api.url","media-version"])
130
+
131
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
132
+ api_request.api_service = :media
133
+ uri = @api_operator.create_request_uri(api_request)
134
+
135
+ uri.kind_of?(URI).should == true
136
+
137
+ uri.to_s.should =~ /http:\/\/media-base.api.url\/media-version\/api\/method/
138
+ uri.to_s.should =~ /[\?\&]param1=value/
139
+ uri.to_s.should =~ /[\?\&]paramTwo=2/
140
+
141
+ end
142
+
143
+ it "should make HTTP request and get http response" do
144
+
145
+ http_response = fake_api_response
146
+
147
+ @stub_http_request = stub(Net::HTTP::Get)
148
+ @stub_http_client = stub(Net::HTTP)
149
+
150
+ @api_operator.should_receive(:create_http_request).with(@stub_api_request).and_return([@stub_http_client, @stub_http_request])
151
+
152
+ @stub_http_client.should_receive(:request).with(@stub_http_request).and_return(http_response)
153
+
154
+ response = @api_operator.make_http_request(@stub_api_request)
155
+
156
+ response.should == http_response
48
157
 
49
158
  end
50
159
 
@@ -53,7 +162,20 @@ describe "ApiOperator" do
53
162
  http_response = fake_api_response
54
163
  digested_response = fake_digested_response
55
164
 
56
- Net::HTTP.stub!(:get_response).and_return(http_response)
165
+ @client.api_response_digestor.should_receive(:from_http_response).with(http_response).and_return(digested_response)
166
+
167
+ response = @api_operator.digest_http_response(http_response)
168
+
169
+ response.should == digested_response
170
+
171
+ end
172
+
173
+ it "should call API by making an http request and digesting the response" do
174
+
175
+ http_response = fake_api_response
176
+ digested_response = fake_digested_response
177
+
178
+ @api_operator.should_receive(:make_http_request).and_return(http_response)
57
179
 
58
180
  @client.api_response_digestor.should_receive(:from_http_response).with(http_response).and_return(digested_response)
59
181
 
@@ -65,20 +187,116 @@ describe "ApiOperator" do
65
187
 
66
188
  it "should throw an exception if response is not ok" do
67
189
 
68
- Net::HTTP.stub(:get_response).and_return(fake_api_response)
69
190
  failed_response = fake_digested_response(false)
70
- failed_response.stub!(:error_code).and_return("4000")
191
+ failed_response.stub!(:error_code).and_return(4000)
71
192
  failed_response.stub!(:error_message).and_return("error")
72
- @client.api_response_digestor.stub!(:from_http_response).and_return(failed_response)
193
+ @api_operator.should_receive(:make_http_request).and_return(fake_api_response)
194
+ @client.api_response_digestor.stub!(:from_http_response).and_return(failed_response)
195
+
196
+ running { @api_operator.call_api(@stub_api_request) }.should raise_error(Sevendigital::SevendigitalError) { |error|
197
+ error.error_code.should == 4000
198
+ error.error_message.should == "error"
199
+ }
200
+
201
+ end
73
202
 
74
- running { @api_operator.call_api(@stub_api_request) }.should raise_error(Sevendigital::SevendigitalError)
203
+ it "should create a 2-legged signed HTTP request" do
204
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
205
+ api_request.require_signature
206
+ http_client, http_request = @api_operator.create_http_request(api_request)
207
+ http_client.use_ssl?.should == false
208
+ http_request.path.should =~ /api\/method/
209
+ http_request.path.should =~ /param1=value/
210
+ http_request["Authorization"].should =~ /OAuth oauth_consumer_key="oauth_consumer_key"/
211
+ http_request["Authorization"].should =~ / oauth_signature=/
212
+ # http_request["Authorization"].should !=~ / oauth_token="token"/
213
+ end
214
+
215
+ it "should create a 3-legged signed HTTP request" do
216
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
217
+ api_request.require_signature
218
+ api_request.token = OAuth::AccessToken.new(@client.oauth_consumer, "token", "secret")
219
+ http_client, http_request = @api_operator.create_http_request(api_request)
220
+ http_client.use_ssl?.should == false
221
+ http_request.path.should =~ /api\/method/
222
+ http_request.path.should =~ /param1=value/
223
+ http_request["Authorization"].should =~ /OAuth oauth_consumer_key="oauth_consumer_key"/
224
+ http_request["Authorization"].should =~ / oauth_signature=/
225
+ http_request["Authorization"].should =~ / oauth_token="token"/
226
+ end
227
+
228
+ it "should create a 3-legged signed HTTPS request" do
229
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
230
+ api_request.require_signature
231
+ api_request.require_secure_connection
232
+ api_request.token = OAuth::AccessToken.new(@client.oauth_consumer, "token", "secret")
233
+ http_client, http_request = @api_operator.create_http_request(api_request)
234
+ http_client.inspect.should =~ /base\.api\.url:443/
235
+ http_client.use_ssl?.should == true
236
+ http_client.verify_mode.should == OpenSSL::SSL::VERIFY_NONE
237
+ http_request.path.should =~ /api\/method/
238
+ http_request.path.should =~ /param1=value/
239
+ http_request["Authorization"].should =~ /OAuth oauth_consumer_key="oauth_consumer_key"/
240
+ http_request["Authorization"].should =~ / oauth_signature=/
241
+ http_request["Authorization"].should =~ / oauth_token="token"/
242
+ end
243
+
244
+ it "should create a standard HTTP request" do
245
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
246
+ http_client, http_request = @api_operator.create_http_request(api_request)
247
+ http_client.inspect.should =~ /base\.api\.url:80/
248
+ http_client.use_ssl?.should == false
249
+ http_request.path.should =~ /api\/method/
250
+ http_request.path.should =~ /param1=value/
251
+ http_request.path.should =~ /oauth_consumer_key=oauth_consumer_key/
252
+ end
253
+
254
+ it "should add custom user agent info to created HTTP request" do
255
+
256
+ @client.stub!(:user_agent_info).and_return("7digital Gem")
257
+
258
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
259
+ http_client, http_request = @api_operator.create_http_request(api_request)
260
+ http_request["User-agent"].should =~ /7digital Gem/
261
+ end
262
+
263
+ it "get_request_uri should return oauth sign URI if api request requires signature" do
264
+
265
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
266
+ api_request.token = OAuth::AccessToken.new(nil, "token", "token_secret")
267
+ api_request.require_signature
268
+ api_request.require_secure_connection
269
+ signed_uri = @api_operator.get_request_uri(api_request)
270
+
271
+ signed_uri.should =~ /oauth_signature=/
272
+ signed_uri.should =~ /oauth_consumer_key=oauth_consumer_key&/
273
+ signed_uri.should =~ /oauth_token=token&/
274
+ signed_uri.should =~ /https:\/\/base.api.url\/version\/api\/method/
275
+ end
276
+
277
+ it "get_request_uri should return simple request URI if api request does not require signature" do
278
+
279
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
280
+ signed_uri = @api_operator.get_request_uri(api_request)
281
+
282
+ signed_uri.match(/oauth_signature=/).should == nil
283
+ signed_uri.should =~ /oauth_consumer_key=oauth_consumer_key/
284
+ signed_uri.should =~ /http:\/\/base.api.url\/version\/api\/method/
285
+ end
286
+
287
+ it "get_request_uri should return secure request URI if api request does not require signature" do
288
+
289
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
290
+ api_request.require_secure_connection
291
+ signed_uri = @api_operator.get_request_uri(api_request)
75
292
 
293
+ signed_uri.match(/oauth_signature=/).should == nil
294
+ signed_uri.should =~ /oauth_consumer_key=oauth_consumer_key/
295
+ signed_uri.should =~ /https:\/\/base.api.url\/version\/api\/method/
76
296
  end
77
297
 
78
298
  def test_configuration
79
299
  configuration = OpenStruct.new
80
- configuration.api_url = "base.api.url"
81
- configuration.api_version = "version"
82
300
  configuration.oauth_consumer_key = "oauth_consumer_key"
83
301
  return configuration
84
302
  end
@@ -96,10 +314,13 @@ describe "ApiOperator" do
96
314
  def stub_api_client(configuration, response_digestor)
97
315
  @client = stub(Sevendigital::Client)
98
316
  @client.stub!(:configuration).and_return(configuration)
317
+ @client.stub!(:oauth_consumer).and_return(OAuth::Consumer.new( configuration.oauth_consumer_key, configuration.oauth_consumer_secret))
99
318
  @client.stub!(:api_response_digestor).and_return(response_digestor)
100
- @client.stub!(:country).and_return("sk")
319
+ @client.stub!(:default_parameters).and_return({:country => 'sk'})
320
+ @client.stub!(:user_agent_info).and_return("7digital")
101
321
  @client.stub!(:verbose?).and_return(false)
102
322
  @client.stub!(:very_verbose?).and_return(false)
323
+ @client.stub!(:api_host_and_version).and_return(["base.api.url","version"])
103
324
 
104
325
  end
105
326
 
@@ -107,7 +328,10 @@ def stub_api_request
107
328
  api_request = stub(Sevendigital::ApiRequest)
108
329
 
109
330
  api_request.stub!(:parameters).and_return({})
331
+ api_request.stub!(:api_service).and_return(nil)
110
332
  api_request.stub!(:api_method).and_return("m")
333
+ api_request.stub!(:requires_signature?).and_return(false)
334
+ api_request.stub!(:requires_secure_connection?).and_return(false)
111
335
  api_request.stub!(:ensure_country_is_set)
112
336
  return api_request
113
337
  end
@@ -1,26 +1,31 @@
1
- require File.join(File.dirname(__FILE__), %w[spec_helper])
1
+ require "spec_helper"
2
2
 
3
3
  describe "ApiRequest" do
4
4
 
5
- it "should merge method parameters and options with parameters taking preference" do
5
+ it "should always provide selected parameters in 7digital API format" do
6
6
 
7
- parameters = {:trackId => 123, :releaseId => 456, :country => "CU"}
8
- options = {:page => 1, :country => "US", :trackId => "SS"}
9
- request = Sevendigital::ApiRequest.new('method', parameters, options)
10
- request.parameters[:trackId].should == 123
11
- request.parameters[:releaseId].should == 456
12
- request.parameters[:country].should == "CU"
13
- request.parameters[:page].should == 1
14
- request.parameters.keys.size.should == 4 # page_size == null
7
+ request = Sevendigital::ApiRequest.new('method', {
8
+ :page => 5,
9
+ :per_page => 3,
10
+ :shop_id => 99,
11
+ :image_size => 999
12
+ })
13
+ request.parameters[:page].should == 5
14
+ request.parameters[:pageSize].should == 3
15
+ request.parameters[:per_page].should == nil
16
+ request.parameters[:shopId].should == 99
17
+ request.parameters[:shop_id].should == nil
18
+ request.parameters[:imageSize].should == 999
19
+ request.parameters[:image_size].should == nil
15
20
 
16
21
  end
17
22
 
18
- it "should provide paging parameters in 7digital API format" do
23
+ it "should not contain nil parameters" do
19
24
 
20
- request = Sevendigital::ApiRequest.new('method', {}, {:page => 5, :per_page => 3 })
21
- request.parameters[:page].should == 5
22
- request.parameters[:pageSize].should == 3
25
+ request = Sevendigital::ApiRequest.new('method', {:key1 => "value", :key2 => nil})
26
+ request.parameters[:key1].should == "value"
27
+ request.parameters.has_key?(:key2).should == false
23
28
 
24
- end
29
+ end
25
30
 
26
31
  end
@@ -0,0 +1,75 @@
1
+ require "spec_helper"
2
+
3
+ describe "ClientConfiguration" do
4
+
5
+ it "should initialize with default configuration" do
6
+ configuration = Sevendigital::ClientConfiguration.new
7
+ configuration.api_url.should == 'api.7digital.com'
8
+ configuration.api_version.should == '1.2'
9
+ configuration.media_api_url.should == 'media-eu.7digital.com'
10
+ configuration.media_api_version.should == 'media'
11
+ configuration.account_api_url.should == 'account.7digital.com'
12
+ configuration.account_api_version.should == 'web'
13
+ end
14
+
15
+ it "should initialize using hash" do
16
+ configuration = Sevendigital::ClientConfiguration.new(:api_url => "test-hash.7digital.com")
17
+ configuration.api_url.should == 'test-hash.7digital.com'
18
+ end
19
+
20
+ it "should initialize using OpenStruct object" do
21
+ configuration = Sevendigital::ClientConfiguration.new(OpenStruct.new(:api_url => "test-openstruct.7digital.com"))
22
+ configuration.api_url.should == 'test-openstruct.7digital.com'
23
+ end
24
+
25
+ it "should initialize using simple YAML file" do
26
+ configuration = Sevendigital::ClientConfiguration.new(File.join(File.dirname(__FILE__),"data", "configuration_override.yml"))
27
+ configuration.api_url.should == 'test-yml-simple.7digital.com'
28
+ end
29
+
30
+ it "should initialize mixing configuration file name and explicit hash override" do
31
+ conf_file = File.join(File.dirname(__FILE__),"data", "configuration_override.yml")
32
+ configuration = Sevendigital::ClientConfiguration.new(conf_file, :api_url => 'hash-override')
33
+ configuration.api_url.should == 'hash-override'
34
+ configuration.api_version.should == 'yml-simple'
35
+ end
36
+
37
+ it "should initialize mixing hash settings and configuration file override" do
38
+ conf_file = File.join(File.dirname(__FILE__),"data", "configuration_override.yml")
39
+ configuration = Sevendigital::ClientConfiguration.new({:api_url => 'hash-override', :xxx => 'yyy'}, conf_file)
40
+ configuration.api_url.should == 'test-yml-simple.7digital.com'
41
+ configuration.xxx.should == 'yyy'
42
+ end
43
+
44
+ it "should initialize mixing 2 explicit hash overrides" do
45
+ configuration = Sevendigital::ClientConfiguration.new( {:api_url => 'v1', :a => 'x'}, {:api_url => 'v2', :b => 'y'})
46
+ configuration.api_url.should == 'v2'
47
+ configuration.a.should == 'x'
48
+ configuration.b.should == 'y'
49
+ end
50
+
51
+ it "should use environment specific configuration file" do
52
+ conf_file = File.join(File.dirname(__FILE__),"data", "configuration_env_override.yml")
53
+ configuration = Sevendigital::ClientConfiguration.new(conf_file)
54
+ configuration.api_url.should == 'test-yml-common.7digital.com'
55
+ end
56
+
57
+ it "should use environment specific configuration file with environment specific settings" do
58
+ conf_file = File.join(File.dirname(__FILE__),"data", "configuration_env_override.yml")
59
+ puts conf_file
60
+ Object.const_set(:RAILS_ENV, "development")
61
+ configuration = Sevendigital::ClientConfiguration.new(conf_file)
62
+ configuration.api_url.should == 'test-yml-development.7digital.com'
63
+ Object.instance_eval{ remove_const :RAILS_ENV }
64
+ end
65
+
66
+ it "should use rails/config/sevendigital configuration as default rails settings" do
67
+ rails_root = File.join(File.dirname(__FILE__),"data")
68
+ puts rails_root
69
+ Object.const_set(:RAILS_ROOT, rails_root)
70
+ configuration = Sevendigital::ClientConfiguration.new()
71
+ configuration.api_url.should == 'test-yml-rails-common.7digital.com'
72
+ Object.instance_eval{ remove_const :RAILS_ROOT }
73
+ end
74
+
75
+ end