channeladvisor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +6 -0
  4. data/.yardopts +8 -0
  5. data/Gemfile +31 -0
  6. data/Guardfile +28 -0
  7. data/LICENSE +19 -0
  8. data/README.md +40 -0
  9. data/Rakefile +69 -0
  10. data/channeladvisor.gemspec +29 -0
  11. data/lib/channeladvisor.rb +27 -0
  12. data/lib/channeladvisor/account_authorization.rb +14 -0
  13. data/lib/channeladvisor/address.rb +39 -0
  14. data/lib/channeladvisor/admin.rb +75 -0
  15. data/lib/channeladvisor/base.rb +34 -0
  16. data/lib/channeladvisor/client.rb +3 -0
  17. data/lib/channeladvisor/configuration.rb +11 -0
  18. data/lib/channeladvisor/error.rb +30 -0
  19. data/lib/channeladvisor/line_item.rb +38 -0
  20. data/lib/channeladvisor/order.rb +179 -0
  21. data/lib/channeladvisor/order_status.rb +14 -0
  22. data/lib/channeladvisor/payment.rb +15 -0
  23. data/lib/channeladvisor/services.rb +11 -0
  24. data/lib/channeladvisor/services/admin_service.rb +47 -0
  25. data/lib/channeladvisor/services/base_service.rb +26 -0
  26. data/lib/channeladvisor/services/inventory_service.rb +90 -0
  27. data/lib/channeladvisor/services/order_service.rb +117 -0
  28. data/lib/channeladvisor/services/shipping_service.rb +164 -0
  29. data/lib/channeladvisor/shipment.rb +71 -0
  30. data/lib/channeladvisor/shopping_cart.rb +26 -0
  31. data/lib/channeladvisor/version.rb +3 -0
  32. data/spec/fixtures/requests/admin_service/get_authorization_list.xml +1 -0
  33. data/spec/fixtures/requests/admin_service/get_authorization_list_with_local_id.xml +1 -0
  34. data/spec/fixtures/requests/admin_service/ping.xml +1 -0
  35. data/spec/fixtures/requests/admin_service/request_access.xml +1 -0
  36. data/spec/fixtures/requests/inventory_service/ping.xml +1 -0
  37. data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/price_only.xml +1 -0
  38. data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_and_price.xml +1 -0
  39. data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_only.xml +1 -0
  40. data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/price_only.xml +1 -0
  41. data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_and_price.xml +1 -0
  42. data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_only.xml +1 -0
  43. data/spec/fixtures/requests/inventory_service/update_item_price.xml +1 -0
  44. data/spec/fixtures/requests/inventory_service/update_item_quantity.xml +1 -0
  45. data/spec/fixtures/requests/inventory_service/update_item_quantity_and_price.xml +1 -0
  46. data/spec/fixtures/requests/order_service/get_order_list/with_checkout_status_filter.xml +1 -0
  47. data/spec/fixtures/requests/order_service/get_order_list/with_created_from_date.xml +1 -0
  48. data/spec/fixtures/requests/order_service/get_order_list/with_created_to_date.xml +1 -0
  49. data/spec/fixtures/requests/order_service/get_order_list/with_detail_level.xml +1 -0
  50. data/spec/fixtures/requests/order_service/get_order_list/with_distribution_center_code.xml +1 -0
  51. data/spec/fixtures/requests/order_service/get_order_list/with_export_state.xml +1 -0
  52. data/spec/fixtures/requests/order_service/get_order_list/with_join_dates.xml +1 -0
  53. data/spec/fixtures/requests/order_service/get_order_list/with_one_client_order_id.xml +1 -0
  54. data/spec/fixtures/requests/order_service/get_order_list/with_one_order_id.xml +1 -0
  55. data/spec/fixtures/requests/order_service/get_order_list/with_order_state_filter.xml +1 -0
  56. data/spec/fixtures/requests/order_service/get_order_list/with_page_number_filter.xml +1 -0
  57. data/spec/fixtures/requests/order_service/get_order_list/with_page_size.xml +1 -0
  58. data/spec/fixtures/requests/order_service/get_order_list/with_payment_status_filter.xml +1 -0
  59. data/spec/fixtures/requests/order_service/get_order_list/with_refund_status_filter.xml +1 -0
  60. data/spec/fixtures/requests/order_service/get_order_list/with_shipping_status_filter.xml +1 -0
  61. data/spec/fixtures/requests/order_service/get_order_list/with_two_client_order_ids.xml +1 -0
  62. data/spec/fixtures/requests/order_service/get_order_list/with_two_order_ids.xml +1 -0
  63. data/spec/fixtures/requests/order_service/get_order_list/with_updated_from_date.xml +1 -0
  64. data/spec/fixtures/requests/order_service/get_order_list/with_updated_to_date.xml +1 -0
  65. data/spec/fixtures/requests/order_service/get_order_list/without_order_criteria.xml +1 -0
  66. data/spec/fixtures/requests/order_service/ping.xml +1 -0
  67. data/spec/fixtures/requests/order_service/set_orders_export_status/with_one_client_order_id.xml +1 -0
  68. data/spec/fixtures/requests/order_service/set_orders_export_status/with_two_client_order_ids.xml +1 -0
  69. data/spec/fixtures/requests/shipping_service/get_shipping_carrier_list.xml +1 -0
  70. data/spec/fixtures/requests/shipping_service/ping.xml +1 -0
  71. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/with_one_shipment.xml +1 -0
  72. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/with_two_shipments.xml +1 -0
  73. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_carrier_code.xml +1 -0
  74. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_class_code.xml +1 -0
  75. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_client_order_id.xml +1 -0
  76. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_seller_id.xml +1 -0
  77. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_tracking_number.xml +1 -0
  78. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/with_one_line_item.xml +1 -0
  79. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/with_two_line_items.xml +1 -0
  80. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/with_two_shipments.xml +1 -0
  81. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_carrier_code.xml +1 -0
  82. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_class_code.xml +1 -0
  83. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_seller_id.xml +1 -0
  84. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_tracking_number.xml +1 -0
  85. data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/with_partial_and_full_shipments.xml +1 -0
  86. data/spec/fixtures/responses/admin/get_authorization_list/failure.yml +50 -0
  87. data/spec/fixtures/responses/admin/get_authorization_list/no_authorizations.yml +49 -0
  88. data/spec/fixtures/responses/admin/get_authorization_list/one_authorization.yml +49 -0
  89. data/spec/fixtures/responses/admin/get_authorization_list/success.yml +49 -0
  90. data/spec/fixtures/responses/admin/get_authorization_list/two_authorizations.yml +49 -0
  91. data/spec/fixtures/responses/admin/ping/failure.yml +50 -0
  92. data/spec/fixtures/responses/admin/ping/success.yml +218 -0
  93. data/spec/fixtures/responses/admin/request_access/failure.yml +50 -0
  94. data/spec/fixtures/responses/admin/request_access/success.yml +49 -0
  95. data/spec/fixtures/responses/admin_service/get_authorization_list/with_invalid_local_id.yml +219 -0
  96. data/spec/fixtures/responses/admin_service/get_authorization_list/with_local_id/success.yml +218 -0
  97. data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/multiple_authorizations.yml +49 -0
  98. data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/no_authorizations.yml +49 -0
  99. data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/one_authorization.yml +49 -0
  100. data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/success.yml +218 -0
  101. data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/multiple_authorizations.yml +49 -0
  102. data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/no_authorizations.yml +49 -0
  103. data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/one_authorization.yml +49 -0
  104. data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/success.yml +218 -0
  105. data/spec/fixtures/responses/admin_service/ping/failure.yml +222 -0
  106. data/spec/fixtures/responses/admin_service/ping/success.yml +218 -0
  107. data/spec/fixtures/responses/admin_service/request_access/failure.yml +219 -0
  108. data/spec/fixtures/responses/admin_service/request_access/success.yml +218 -0
  109. data/spec/fixtures/responses/http_error.yml +48 -0
  110. data/spec/fixtures/responses/inventory_service/ping.yml +1356 -0
  111. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price.yml +1356 -0
  112. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price/price_only.yml +144 -0
  113. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price/quantity_and_price.yml +191 -0
  114. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price/quantity_only.yml +1403 -0
  115. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list.yml +243 -0
  116. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/price_only.yml +97 -0
  117. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_and_price.yml +144 -0
  118. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_only.yml +51 -0
  119. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/price_only.yml +238 -0
  120. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_and_price.yml +285 -0
  121. data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_only.yml +191 -0
  122. data/spec/fixtures/responses/order/instance_set_export_status.yml +51 -0
  123. data/spec/fixtures/responses/order/instance_set_export_status/failure.yml +51 -0
  124. data/spec/fixtures/responses/order/instance_set_export_status/success/result_false.yml +51 -0
  125. data/spec/fixtures/responses/order/instance_set_export_status/success/result_true.yml +51 -0
  126. data/spec/fixtures/responses/order/list.yml +58 -0
  127. data/spec/fixtures/responses/order/list/failure.yml +56 -0
  128. data/spec/fixtures/responses/order/list/no_matching_orders.yml +56 -0
  129. data/spec/fixtures/responses/order/list/one_matching_order.yml +57 -0
  130. data/spec/fixtures/responses/order/list/two_matching_orders.yml +59 -0
  131. data/spec/fixtures/responses/order/list/with_criteria.yml +52 -0
  132. data/spec/fixtures/responses/order/list/with_no_criteria.yml +58 -0
  133. data/spec/fixtures/responses/order/ping.yml +868 -0
  134. data/spec/fixtures/responses/order/ping/failure.yml +50 -0
  135. data/spec/fixtures/responses/order/ping/success.yml +867 -0
  136. data/spec/fixtures/responses/order/set_export_status/failure.yml +51 -0
  137. data/spec/fixtures/responses/order/set_export_status/success/with_one_client_order_id.yml +51 -0
  138. data/spec/fixtures/responses/order/set_export_status/success/with_two_client_order_ids.yml +51 -0
  139. data/spec/fixtures/responses/order_service/get_order_list/.gitkeep +0 -0
  140. data/spec/fixtures/responses/order_service/get_order_list/with_checkout_status_filter.yml +875 -0
  141. data/spec/fixtures/responses/order_service/get_order_list/with_created_from_date.yml +874 -0
  142. data/spec/fixtures/responses/order_service/get_order_list/with_created_to_date.yml +874 -0
  143. data/spec/fixtures/responses/order_service/get_order_list/with_detail_level.yml +875 -0
  144. data/spec/fixtures/responses/order_service/get_order_list/with_distribution_center_code.yml +872 -0
  145. data/spec/fixtures/responses/order_service/get_order_list/with_export_state.yml +875 -0
  146. data/spec/fixtures/responses/order_service/get_order_list/with_join_dates.yml +869 -0
  147. data/spec/fixtures/responses/order_service/get_order_list/with_one_client_order_id.yml +872 -0
  148. data/spec/fixtures/responses/order_service/get_order_list/with_one_order_id.yml +873 -0
  149. data/spec/fixtures/responses/order_service/get_order_list/with_order_state_filter.yml +875 -0
  150. data/spec/fixtures/responses/order_service/get_order_list/with_page_number_filter.yml +875 -0
  151. data/spec/fixtures/responses/order_service/get_order_list/with_page_size.yml +874 -0
  152. data/spec/fixtures/responses/order_service/get_order_list/with_payment_status_filter.yml +875 -0
  153. data/spec/fixtures/responses/order_service/get_order_list/with_refund_status_filter.yml +875 -0
  154. data/spec/fixtures/responses/order_service/get_order_list/with_shipping_status_filter.yml +875 -0
  155. data/spec/fixtures/responses/order_service/get_order_list/with_two_client_order_ids.yml +872 -0
  156. data/spec/fixtures/responses/order_service/get_order_list/with_two_order_ids.yml +875 -0
  157. data/spec/fixtures/responses/order_service/get_order_list/with_updated_from_date.yml +874 -0
  158. data/spec/fixtures/responses/order_service/get_order_list/with_updated_to_date.yml +874 -0
  159. data/spec/fixtures/responses/order_service/get_order_list/without_order_criteria.yml +871 -0
  160. data/spec/fixtures/responses/order_service/get_order_refund_history/.gitkeep +0 -0
  161. data/spec/fixtures/responses/order_service/order_merge/.gitkeep +0 -0
  162. data/spec/fixtures/responses/order_service/order_split/.gitkeep +0 -0
  163. data/spec/fixtures/responses/order_service/ping/.gitkeep +0 -0
  164. data/spec/fixtures/responses/order_service/ping/failure.yml +871 -0
  165. data/spec/fixtures/responses/order_service/ping/success.yml +868 -0
  166. data/spec/fixtures/responses/order_service/set_orders_export_status/with_one_client_order_id.yml +867 -0
  167. data/spec/fixtures/responses/order_service/set_orders_export_status/with_two_client_order_id.yml +867 -0
  168. data/spec/fixtures/responses/order_service/set_seller_order_id/.gitkeep +0 -0
  169. data/spec/fixtures/responses/order_service/set_seller_order_item_id_list/.gitkeep +0 -0
  170. data/spec/fixtures/responses/order_service/submit_order/.gitkeep +0 -0
  171. data/spec/fixtures/responses/order_service/submit_order_refund/.gitkeep +0 -0
  172. data/spec/fixtures/responses/order_service/update_order_list/.gitkeep +0 -0
  173. data/spec/fixtures/responses/shipment/get_carriers.yml +53 -0
  174. data/spec/fixtures/responses/shipment/get_carriers/failure.yml +52 -0
  175. data/spec/fixtures/responses/shipment/submit.yml +464 -0
  176. data/spec/fixtures/responses/shipment/submit/failure.yml +462 -0
  177. data/spec/fixtures/responses/shipment/submit/one_shipment.yml +464 -0
  178. data/spec/fixtures/responses/shipment/submit/two_shipments.yml +56 -0
  179. data/spec/fixtures/responses/shipping_service/get_shipping_carrier_list.yml +953 -0
  180. data/spec/fixtures/responses/shipping_service/ping/failure.yml +55 -0
  181. data/spec/fixtures/responses/shipping_service/ping/success.yml +460 -0
  182. data/spec/fixtures/responses/shipping_service/submit_order_shipment_list.yml +55 -0
  183. data/spec/fixtures/responses/soap_fault.yml +53 -0
  184. data/spec/lib/channeladvisor/address_spec.rb +107 -0
  185. data/spec/lib/channeladvisor/admin_spec.rb +216 -0
  186. data/spec/lib/channeladvisor/line_item_spec.rb +147 -0
  187. data/spec/lib/channeladvisor/order_spec.rb +623 -0
  188. data/spec/lib/channeladvisor/order_status_spec.rb +36 -0
  189. data/spec/lib/channeladvisor/payment_spec.rb +38 -0
  190. data/spec/lib/channeladvisor/services/admin_service_spec.rb +65 -0
  191. data/spec/lib/channeladvisor/services/base_service_spec.rb +11 -0
  192. data/spec/lib/channeladvisor/services/inventory_service_spec.rb +214 -0
  193. data/spec/lib/channeladvisor/services/order_service_spec.rb +267 -0
  194. data/spec/lib/channeladvisor/services/shipping_service_spec.rb +288 -0
  195. data/spec/lib/channeladvisor/shipment_spec.rb +257 -0
  196. data/spec/lib/channeladvisor/shopping_cart_spec.rb +173 -0
  197. data/spec/lib/channeladvisor_spec.rb +18 -0
  198. data/spec/spec_helper.rb +29 -0
  199. data/spec/support/credentials.rb +15 -0
  200. data/spec/support/matchers/boolean.rb +17 -0
  201. data/spec/support/matchers/markup.rb +50 -0
  202. data/spec/support/rr.rb +38 -0
  203. data/spec/support/shared_examples.rb +4 -0
  204. data/spec/support/vcr.rb +38 -0
  205. metadata +501 -0
@@ -0,0 +1,623 @@
1
+ require 'spec_helper'
2
+
3
+ module ChannelAdvisor
4
+ describe Order do
5
+ describe ".new" do
6
+ let(:attrs) do
7
+ {
8
+ :number_of_matches=>"2",
9
+ :order_time_gmt=> DateTime.parse("2012-05-16T15:44:27+00:00 ((2456064j,56667s,683000000n),+0s,2299161j)"),
10
+ :last_update_date=> DateTime.parse("2012-05-16T15:44:27+00:00 ((2456064j,56667s,723000000n),+0s,2299161j)"),
11
+ :total_order_amount=>"44.9200",
12
+ :order_state=>"Active",
13
+ :date_cancelled_gmt=>DateTime.new(2012,05,17),
14
+ :order_id=>"14161613",
15
+ :client_order_identifier=>"14161613",
16
+ :seller_order_id=>"EFGH5678",
17
+ :reseller_id=>"999999",
18
+ :buyer_email_address=>"test@example.com",
19
+ :email_opt_in=>false,
20
+ :flag_description=>nil,
21
+ :custom_value_list=>{},
22
+ :buyer_ip_address=>"50.29.99.129",
23
+ :transaction_notes=>"Example notes",
24
+ :"@xmlns:q1"=>"http://api.channeladvisor.com/datacontracts/orders",
25
+ :"@xsi:type"=>"q1:OrderResponseDetailComplete"
26
+ }
27
+ end
28
+
29
+ subject { Order.new(attrs) }
30
+
31
+ its(:created_at) { should == attrs[:order_time_gmt] }
32
+ its(:updated_at) { should == attrs[:last_update_date] }
33
+ its(:total) { should == attrs[:total_order_amount].to_f }
34
+ its(:state) { should == attrs[:order_state] }
35
+ its(:cancelled_on) { should == attrs[:date_cancelled_gmt] }
36
+ its(:id) { should == attrs[:order_id].to_i }
37
+ its(:client_id) { should == attrs[:client_order_identifier] }
38
+ its(:seller_id) { should == attrs[:seller_order_id] }
39
+ its(:reseller_id) { should == attrs[:reseller_id] }
40
+ its(:buyer_email) { should == attrs[:buyer_email_address] }
41
+ its(:email_opt_in) { should == attrs[:email_opt_in] }
42
+ its(:flag_description) { should == attrs[:flag_description] }
43
+ its(:custom_values) { should == attrs[:custom_value_list] }
44
+ its(:buyer_ip_address) { should == attrs[:buyer_ip_address] }
45
+ its(:transaction_notes) { should == attrs[:transaction_notes] }
46
+
47
+ context "with shipping info" do
48
+ let(:attrs) do
49
+ {
50
+ :shipping_info=> {
51
+ :shipping_instructions => "do some stuff",
52
+ :estimated_ship_date => DateTime.new(2012,05,18),
53
+ :delivery_date => DateTime.new(2012,05,21),
54
+ :shipment_list => {
55
+ :shipment => {:shipping_carrier => "UPS", :shipping_class => "GND", :tracking_number => "1234567890"}
56
+ }
57
+ }
58
+ }
59
+ end
60
+
61
+ its(:shipping_instructions) { should == attrs[:shipping_info][:shipping_instructions] }
62
+ its(:estimated_ship_date) { should == attrs[:shipping_info][:estimated_ship_date] }
63
+ its(:delivery_date) { should == attrs[:shipping_info][:delivery_date] }
64
+
65
+ context "with one shipment" do
66
+ before(:each) do
67
+ stub.proxy(Shipment).new
68
+ @order = Order.new(attrs)
69
+ end
70
+
71
+ it "creates a new shipment object from the attributes hash" do
72
+ shipment = attrs[:shipping_info][:shipment_list][:shipment]
73
+ Shipment.should have_received.new(shipment)
74
+ end
75
+
76
+ it "creates a @shipments collection with one shipment" do
77
+ @order.shipments.should have(1).shipment
78
+ @order.shipments.first.should be_a Shipment
79
+ end
80
+ end
81
+
82
+ context "with two shipments" do
83
+ before(:each) do
84
+ @shipments = attrs[:shipping_info][:shipment_list] = {
85
+ :shipment => [
86
+ {:shipping_carrier => "FedEx", :shipping_class => "Home Delivery", :tracking_number => "999999"},
87
+ {:shipping_carrier => "UPS", :shipping_class => "Ground", :tracking_number => "1234567"}
88
+ ]
89
+ }
90
+ stub.proxy(Shipment).new
91
+ @order = Order.new(attrs)
92
+ end
93
+
94
+ it "creates a @shipments collection with two shipments" do
95
+ @order.shipments.should have(2).shipments
96
+ @order.shipments.each do |shipment|
97
+ shipment.should be_a Shipment
98
+ end
99
+ end
100
+
101
+ it "creates a new shipment object for each shipment in the attribute hash" do
102
+ @shipments[:shipment].each do |shipment|
103
+ Shipment.should have_received.new(shipment)
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+
110
+ context "with order_status in the attributes hash" do
111
+ let(:attrs) do
112
+ {:order_status => {}}
113
+ end
114
+
115
+ its(:status) { should be_an OrderStatus }
116
+
117
+ it "sets @status to an OrderStatus object" do
118
+ stub(OrderStatus).new
119
+ Order.new(attrs)
120
+ OrderStatus.should have_received.new(attrs[:order_status])
121
+ end
122
+ end
123
+
124
+ context "with payment_info in the attributes hash" do
125
+ let(:attrs) do
126
+ {:payment_info => {}}
127
+ end
128
+
129
+ its(:payment) { should be_a Payment }
130
+
131
+ it "sets @payment to a Payment object" do
132
+ stub(Payment).new
133
+ Order.new(attrs)
134
+ Payment.should have_received.new(attrs[:payment_info])
135
+ end
136
+ end
137
+
138
+
139
+ context "with billing_address in the attributes hash" do
140
+ let(:attrs) do
141
+ {:billing_info => {:billing_stuff => nil}}
142
+ end
143
+
144
+ its(:billing_address) { should be_an Address }
145
+
146
+ it "sets @billing_address to an Address object" do
147
+ stub(Address).new
148
+ order = Order.new(attrs)
149
+ Address.should have_received.new(attrs[:billing_info])
150
+ end
151
+ end
152
+
153
+ context "with shipping_address in the attributes hash" do
154
+ let(:attrs) do
155
+ {:shipping_info => {:shipping_stuff => nil}}
156
+ end
157
+
158
+ its(:shipping_address) { should be_an Address }
159
+
160
+ it "sets @shipping_address to an Address object" do
161
+ stub(Address).new
162
+ order = Order.new(attrs)
163
+ Address.should have_received.new(attrs[:shipping_info])
164
+ end
165
+ end
166
+
167
+ context "with shopping_cart in the attributes hash" do
168
+ let(:attrs) do
169
+ {:shopping_cart => {}}
170
+ end
171
+
172
+ its(:shopping_cart) { should be_a ShoppingCart }
173
+
174
+ it "sets @shopping_cart to a ShoppingCart object" do
175
+ stub(ShoppingCart).new
176
+ Order.new(attrs)
177
+ ShoppingCart.should have_received.new(attrs[:shopping_cart])
178
+ end
179
+ end
180
+ end
181
+
182
+ describe "#items_ship_cost" do
183
+ let(:items) { [@item] }
184
+
185
+ before(:each) do
186
+ @order = Order.new
187
+ @item = Object.new
188
+ stub(@item).shipping_cost { 1.50 }
189
+ stub(@order).shopping_cart.stub!.items { items }
190
+ end
191
+
192
+ context "with one item" do
193
+ it "returns the shipping cost of the order item" do
194
+ @order.items_ship_cost.should == 1.50
195
+ end
196
+
197
+ context "when item shipping cost is 0.00" do
198
+ it "returns 0.00" do
199
+ stub(@item).shipping_cost { 0.00 }
200
+ @order.items_ship_cost.should == 0.00
201
+ end
202
+ end
203
+ end
204
+
205
+ context "with two items" do
206
+ let(:items) { [@item, @item] }
207
+
208
+ it "returns the cumulative shipping cost of all order items" do
209
+ @order.items_ship_cost.should == 3.00
210
+ end
211
+ end
212
+ end
213
+
214
+ describe "#invoice_ship_cost" do
215
+ before(:each) do
216
+ @order = Order.new
217
+ invoice = Object.new
218
+ stub(invoice).type { "Shipping" }
219
+ stub(invoice).unit_price { unit_price }
220
+ stub(@order).shopping_cart.stub!.invoices { [invoice] }
221
+ end
222
+
223
+ context "when shipping cost is 0" do
224
+ let(:unit_price) { 0.00 }
225
+
226
+ it "returns nil" do
227
+ @order.invoice_ship_cost.should == nil
228
+ end
229
+ end
230
+
231
+ context "when shipping cost is not 0" do
232
+ let(:unit_price) { 5.99 }
233
+
234
+ it "returns the shipping cost from the shipping invoice" do
235
+ @order.invoice_ship_cost.should == 5.99
236
+ end
237
+ end
238
+ end
239
+
240
+ describe "#total_ship_cost" do
241
+ before(:each) do
242
+ @order = Order.new
243
+ end
244
+ context "when the invoice shipping cost is nil" do
245
+ it "returns the items shipping cost" do
246
+ stub(@order).invoice_ship_cost { nil }
247
+ stub(@order).items_ship_cost { 5.99 }
248
+ @order.total_ship_cost.should == 5.99
249
+ end
250
+ end
251
+
252
+ context "when the invoice shipping cost is not nil" do
253
+ it "returns the invoice shipping cost" do
254
+ stub(@order).invoice_ship_cost { 2.99 }
255
+ @order.total_ship_cost.should == 2.99
256
+ end
257
+ end
258
+ end
259
+
260
+ describe ".ping" do
261
+ use_vcr_cassette "responses/order/ping"
262
+
263
+ it "sends a ping request to the Order Service" do
264
+ mock.proxy(Services::OrderService).ping
265
+ Order.ping
266
+ end
267
+
268
+ context "with a success status" do
269
+ use_vcr_cassette "responses/order/ping/success"
270
+
271
+ it "returns true" do
272
+ Order.ping.should be_true
273
+ end
274
+ end
275
+
276
+ context "with a failure status" do
277
+ failure = {:code => 1, :message => "Service Unavailable"}
278
+ use_vcr_cassette "responses/order/ping/failure", :erb => failure
279
+
280
+ it "raises a ServiceFailure error" do
281
+ expect { Order.ping }.to raise_error ServiceFailure, failure[:message]
282
+ end
283
+ end
284
+
285
+ context "with a SOAP fault" do
286
+ use_vcr_cassette "responses/soap_fault", :match_requests_on => [:method]
287
+
288
+ it "raises a SOAP fault error" do
289
+ ChannelAdvisor.configure { |c| c.developer_key = "WRONG" }
290
+ expect { Order.ping }.to raise_error SOAPFault, "Server was unable to process request. Authentication failed."
291
+ end
292
+
293
+ it "stores the SOAP fault code" do
294
+ begin
295
+ Order.ping
296
+ rescue SOAPFault => fault
297
+ fault.code.should == "soap:Server"
298
+ end
299
+ end
300
+ end
301
+
302
+ context "with an HTTP error" do
303
+ http_status = {:code => 500, :message => "Internal Server Error"}
304
+ use_vcr_cassette "responses/http_error", :match_requests_on => [:method], :erb => http_status
305
+
306
+ it "raises an HTTP error" do
307
+ expect { Order.ping }.to raise_error HTTPError, "Failed with HTTP error #{http_status[:code]}"
308
+ end
309
+
310
+ it "stores the HTTP status code" do
311
+ begin
312
+ Order.ping
313
+ rescue HTTPError => error
314
+ error.code.should == http_status[:code]
315
+ end
316
+ end
317
+ end
318
+ end
319
+
320
+ describe ".list" do
321
+ context "with a success status" do
322
+ context "with no matching orders" do
323
+ use_vcr_cassette "responses/order/list/no_matching_orders"
324
+
325
+ it "returns a collection with zero orders" do
326
+ orders = Order.list(:order_ids => [00000000])
327
+ orders.should have(0).orders
328
+ end
329
+ end
330
+
331
+ context "with one matching order" do
332
+ use_vcr_cassette "responses/order/list/one_matching_order"
333
+ before { @orders = Order.list(:order_ids => [14161613]) }
334
+
335
+ it "returns a collection with one order" do
336
+ @orders.should have(1).order
337
+ end
338
+
339
+ it "contains only order objects" do
340
+ @orders.each do |order|
341
+ order.should be_an Order
342
+ end
343
+ end
344
+ end
345
+
346
+ context "with two matching orders" do
347
+ use_vcr_cassette "responses/order/list/two_matching_orders"
348
+ before { @orders = Order.list(:order_ids => [14161613, 14162751]) }
349
+
350
+ it "returns a collection with two orders" do
351
+ @orders.should have(2).orders
352
+ end
353
+
354
+ it "contains only order objects" do
355
+ @orders.each do |order|
356
+ order.should be_an Order
357
+ end
358
+ end
359
+ end
360
+ end
361
+
362
+ context "with a failure status" do
363
+ use_vcr_cassette "responses/order/list/failure"
364
+
365
+ it "raises a ServiceFailure error" do
366
+ message = "Extreme is not a valid value for DetailLevel"
367
+ expect { Order.list(:detail_level => "Extreme") }.to raise_error ServiceFailure, message
368
+ end
369
+ end
370
+
371
+ context "with a SOAP fault" do
372
+ use_vcr_cassette "responses/soap_fault", :match_requests_on => [:method]
373
+
374
+ it "raises a SOAP fault error" do
375
+ ChannelAdvisor.configure { |c| c.developer_key = "WRONG" }
376
+ expect { Order.list }.to raise_error SOAPFault, "Server was unable to process request. Authentication failed."
377
+ end
378
+
379
+ it "stores the SOAP fault code" do
380
+ begin
381
+ Order.list
382
+ rescue SOAPFault => fault
383
+ fault.code.should == "soap:Server"
384
+ end
385
+ end
386
+ end
387
+
388
+ context "with an HTTP error" do
389
+ http_status = {:code => 500, :message => "Internal Server Error"}
390
+ use_vcr_cassette "responses/http_error", :match_requests_on => [:method], :erb => http_status
391
+
392
+ it "raises an HTTP error" do
393
+ expect { Order.list }.to raise_error HTTPError, "Failed with HTTP error #{http_status[:code]}"
394
+ end
395
+
396
+ it "stores the HTTP status code" do
397
+ begin
398
+ Order.list
399
+ rescue HTTPError => error
400
+ error.code.should == http_status[:code]
401
+ end
402
+ end
403
+ end
404
+
405
+ context "with no criteria" do
406
+ use_vcr_cassette "responses/order/list/with_no_criteria"
407
+
408
+ it "sends a list request to the Order Service without criteria" do
409
+ mock.proxy(Services::OrderService).get_order_list({})
410
+ Order.list
411
+ end
412
+ end
413
+
414
+ context "with criteria" do
415
+ use_vcr_cassette "responses/order/list/with_criteria"
416
+
417
+ before(:each) do
418
+ @criteria = {
419
+ :created_from => DateTime.new(2012,05,15),
420
+ :created_to => DateTime.new(2012,05,17),
421
+ :updated_from => DateTime.new(2012,05,15),
422
+ :updated_to => DateTime.new(2012,05,17),
423
+ :join_dates => false,
424
+ :detail_level => "Low",
425
+ :export_state => "NotExported",
426
+ :order_ids => [123456, 567890],
427
+ :client_order_ids => ["ABCD1234", "EFGH5678"],
428
+ :state => "Active",
429
+ :payment_status => "Cleared",
430
+ :checkout_status => "Completed",
431
+ :shipping_status => "Unshipped",
432
+ :refund_status => "NoRefunds",
433
+ :distribution_center => "ABC",
434
+ :page_number => 1,
435
+ :page_size => 25
436
+ }
437
+ end
438
+
439
+ it "sends criteria to OrderService.get_order_list" do
440
+ mock.proxy(Services::OrderService).get_order_list(@criteria)
441
+ Order.list(@criteria)
442
+ end
443
+
444
+ context "with created_between date range criteria" do
445
+ it "sends only created_from and created_to criteria to OrderService.get_order_list" do
446
+ date_range = DateTime.new(2012,05,20)..DateTime.new(2012,05,25)
447
+ new_criteria = @criteria.merge(:created_between => date_range)
448
+ @criteria.merge!(:created_from => date_range.first, :created_to => date_range.last)
449
+
450
+ mock.proxy(Services::OrderService).get_order_list(@criteria)
451
+ Order.list(new_criteria)
452
+ end
453
+ end
454
+
455
+ context "with updated_between date range criteria" do
456
+ it "sends only updated_from and updated_to criteria to OrderService.get_order_list" do
457
+ date_range = DateTime.new(2012,05,20)..DateTime.new(2012,05,25)
458
+ new_criteria = @criteria.merge(:updated_between => date_range)
459
+ @criteria.merge!(:updated_from => date_range.first, :updated_to => date_range.last)
460
+
461
+ mock.proxy(Services::OrderService).get_order_list(@criteria)
462
+ Order.list(new_criteria)
463
+ end
464
+ end
465
+ end
466
+ end # list
467
+
468
+ describe "#set_export_status" do
469
+ use_vcr_cassette "responses/order/instance_set_export_status"
470
+ before { @order = Order.new(:order_id => 14162751, :client_order_identifier => "14162751") }
471
+
472
+ it "sends the client order ID and export status to OrderService.set_orders_export_status" do
473
+ mock.proxy(Services::OrderService).set_orders_export_status(["14162751"], false)
474
+ @order.set_export_status(false)
475
+ end
476
+
477
+ context "with a success status" do
478
+ context "with a result of true" do
479
+ use_vcr_cassette "responses/order/instance_set_export_status/success/result_true", :exclusive => true
480
+
481
+ it "returns true" do
482
+ result = @order.set_export_status(false)
483
+ result.should == true
484
+ end
485
+ end
486
+
487
+ context "with a result of false" do
488
+ use_vcr_cassette "responses/order/instance_set_export_status/success/result_false", :exclusive => true
489
+
490
+ it "returns false" do
491
+ order = Order.new(:order_id => 12345678, :client_order_id => "12345678")
492
+ result = order.set_export_status(false)
493
+ result.should == false
494
+ end
495
+ end
496
+ end
497
+
498
+ context "with a failure status" do
499
+ failure = {:code => 1, :message => "Service Unavailable"}
500
+ use_vcr_cassette "responses/order/instance_set_export_status/failure", :erb => failure
501
+
502
+ it "raises a ServiceFailure error" do
503
+ expect { @order.set_export_status(false) }.to raise_error ServiceFailure, failure[:message]
504
+ end
505
+ end
506
+
507
+ context "with a SOAP fault" do
508
+ use_vcr_cassette "responses/soap_fault", :match_requests_on => [:method]
509
+
510
+ it "raises a SOAP fault error" do
511
+ ChannelAdvisor.configure { |c| c.developer_key = "WRONG" }
512
+ expect { Order.list }.to raise_error SOAPFault, "Server was unable to process request. Authentication failed."
513
+ end
514
+
515
+ it "stores the SOAP fault code" do
516
+ begin
517
+ @order.set_export_status(false)
518
+ rescue SOAPFault => fault
519
+ fault.code.should == "soap:Server"
520
+ end
521
+ end
522
+ end
523
+
524
+ context "with an HTTP error" do
525
+ http_status = {:code => 500, :message => "Internal Server Error"}
526
+ use_vcr_cassette "responses/http_error", :match_requests_on => [:method], :erb => http_status
527
+
528
+ it "raises an HTTP error" do
529
+ expect { @order.set_export_status(false) }.to raise_error HTTPError, "Failed with HTTP error #{http_status[:code]}"
530
+ end
531
+
532
+ it "stores the HTTP status code" do
533
+ begin
534
+ @order.set_export_status(false)
535
+ rescue HTTPError => error
536
+ error.code.should == http_status[:code]
537
+ end
538
+ end
539
+ end
540
+ end # #set_export_status
541
+
542
+ describe ".set_export_status" do
543
+ context "with a success status" do
544
+ context "with one client order ID" do
545
+ use_vcr_cassette "responses/order/set_export_status/success/with_one_client_order_id"
546
+
547
+ it "sends the client order ID and export status to OrderService.set_orders_export_status" do
548
+ stub.proxy(Services::OrderService).set_orders_export_status
549
+ Order.set_export_status("14162751", false)
550
+ Services::OrderService.should have_received.set_orders_export_status(["14162751"], false)
551
+ end
552
+
553
+ it "returns a hash with one client order ID and boolean result" do
554
+ result = Order.set_export_status("14162751", false)
555
+ result.should be_a_boolean
556
+ end
557
+ end
558
+
559
+ context "with two client order IDs" do
560
+ use_vcr_cassette "responses/order/set_export_status/success/with_two_client_order_ids"
561
+
562
+ let(:client_order_ids) { ["14162751", "14161613"] }
563
+
564
+ it "sends the client order IDs and export statuses to OrderService.set_orders_export_status" do
565
+ stub.proxy(Services::OrderService).set_orders_export_status
566
+ Order.set_export_status(client_order_ids, false)
567
+ Services::OrderService.should have_received.set_orders_export_status(client_order_ids, false)
568
+ end
569
+
570
+ it "returns a hash with two client order IDs and boolean results" do
571
+ results = Order.set_export_status(client_order_ids, false)
572
+ client_order_ids.each do |client_order_id|
573
+ results[client_order_id].should be_a_boolean
574
+ end
575
+ end
576
+ end
577
+ end
578
+
579
+ context "with a failure status" do
580
+ failure = {:code => 1, :message => "Service Unavailable"}
581
+ use_vcr_cassette "responses/order/set_export_status/failure", :erb => failure
582
+
583
+ it "raises a ServiceFailure error" do
584
+ expect { Order.set_export_status(["14162751"], false) }.to raise_error ServiceFailure, failure[:message]
585
+ end
586
+ end
587
+
588
+ context "with a SOAP fault" do
589
+ use_vcr_cassette "responses/soap_fault", :match_requests_on => [:method]
590
+
591
+ it "raises a SOAP fault error" do
592
+ ChannelAdvisor.configure { |c| c.developer_key = "WRONG" }
593
+ expect { Order.list }.to raise_error SOAPFault, "Server was unable to process request. Authentication failed."
594
+ end
595
+
596
+ it "stores the SOAP fault code" do
597
+ begin
598
+ Order.set_export_status(["14162751"], false)
599
+ rescue SOAPFault => fault
600
+ fault.code.should == "soap:Server"
601
+ end
602
+ end
603
+ end
604
+
605
+ context "with an HTTP error" do
606
+ http_status = {:code => 500, :message => "Internal Server Error"}
607
+ use_vcr_cassette "responses/http_error", :match_requests_on => [:method], :erb => http_status
608
+
609
+ it "raises an HTTP error" do
610
+ expect { Order.set_export_status(["14162751"], false) }.to raise_error HTTPError, "Failed with HTTP error #{http_status[:code]}"
611
+ end
612
+
613
+ it "stores the HTTP status code" do
614
+ begin
615
+ Order.set_export_status(["14162751"], false)
616
+ rescue HTTPError => error
617
+ error.code.should == http_status[:code]
618
+ end
619
+ end
620
+ end
621
+ end # .set_export_status
622
+ end # Order
623
+ end # ChannelAdvisor