ship_compliant 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +7 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +50 -0
  7. data/Rakefile +47 -0
  8. data/cucumber.yml +9 -0
  9. data/features/add_update_brand.feature +20 -0
  10. data/features/add_update_product.feature +24 -0
  11. data/features/check_compliance_of_sales_order_with_address_validations.feature +18 -0
  12. data/features/commit_sales_order.feature +6 -0
  13. data/features/get_inventory_details.feature +7 -0
  14. data/features/get_sales_order_extended.feature +15 -0
  15. data/features/search_sales_orders.feature +13 -0
  16. data/features/step_definitions/brand_steps.rb +73 -0
  17. data/features/step_definitions/commit_sales_order/all_shipments.rb +15 -0
  18. data/features/step_definitions/compliance_check/available_product_steps.rb +175 -0
  19. data/features/step_definitions/compliance_check/missing_product_steps.rb +102 -0
  20. data/features/step_definitions/compliance_check/noncompliant_product.rb +102 -0
  21. data/features/step_definitions/credential_steps.rb +8 -0
  22. data/features/step_definitions/inventory_steps.rb +36 -0
  23. data/features/step_definitions/product_steps.rb +140 -0
  24. data/features/step_definitions/sales_order_extended_steps.rb +79 -0
  25. data/features/step_definitions/search_order_steps.rb +87 -0
  26. data/features/step_definitions/void_order_steps.rb +27 -0
  27. data/features/support/env.rb +14 -0
  28. data/features/void_sales_order.feature +11 -0
  29. data/fixtures/vcr_cassettes/brand_already_exists.yml +1038 -0
  30. data/fixtures/vcr_cassettes/brand_ignore_existing.yml +1037 -0
  31. data/fixtures/vcr_cassettes/brand_update_existing.yml +1037 -0
  32. data/fixtures/vcr_cassettes/brand_valid.yml +1037 -0
  33. data/fixtures/vcr_cassettes/commit_salesorder_all_shipments.yml +1034 -0
  34. data/fixtures/vcr_cassettes/compliance_available_product.yml +1075 -0
  35. data/fixtures/vcr_cassettes/compliance_missing_product.yml +1046 -0
  36. data/fixtures/vcr_cassettes/compliance_noncompliant_product.yml +1082 -0
  37. data/fixtures/vcr_cassettes/ignore_existing_product.yml +1035 -0
  38. data/fixtures/vcr_cassettes/invalid_search_sales_orders.yml +1038 -0
  39. data/fixtures/vcr_cassettes/inventory_details_for_everything.yml +1037 -0
  40. data/fixtures/vcr_cassettes/product_already_exists.yml +1036 -0
  41. data/fixtures/vcr_cassettes/product_invalid_brand.yml +1036 -0
  42. data/fixtures/vcr_cassettes/product_valid_brand.yml +1035 -0
  43. data/fixtures/vcr_cassettes/sales_order_extended.yml +1042 -0
  44. data/fixtures/vcr_cassettes/sales_order_missing.yml +1034 -0
  45. data/fixtures/vcr_cassettes/search_sales_orders.yml +1039 -0
  46. data/fixtures/vcr_cassettes/update_product.yml +1035 -0
  47. data/fixtures/vcr_cassettes/void_order.yml +1033 -0
  48. data/fixtures/vcr_cassettes/void_voided_order.yml +1034 -0
  49. data/lib/ship_compliant.rb +62 -0
  50. data/lib/ship_compliant/add_update_brand.rb +50 -0
  51. data/lib/ship_compliant/add_update_brand_result.rb +6 -0
  52. data/lib/ship_compliant/add_update_product.rb +66 -0
  53. data/lib/ship_compliant/add_update_product_result.rb +6 -0
  54. data/lib/ship_compliant/address.rb +87 -0
  55. data/lib/ship_compliant/address/suggested_address.rb +37 -0
  56. data/lib/ship_compliant/base_result.rb +43 -0
  57. data/lib/ship_compliant/channel_details.rb +31 -0
  58. data/lib/ship_compliant/check_compliance.rb +41 -0
  59. data/lib/ship_compliant/check_compliance_result.rb +95 -0
  60. data/lib/ship_compliant/client.rb +54 -0
  61. data/lib/ship_compliant/commit_sales_order.rb +48 -0
  62. data/lib/ship_compliant/commit_sales_order_result.rb +30 -0
  63. data/lib/ship_compliant/compliance_rule.rb +30 -0
  64. data/lib/ship_compliant/configuration.rb +46 -0
  65. data/lib/ship_compliant/error_result.rb +41 -0
  66. data/lib/ship_compliant/freight_sales_tax_rate.rb +8 -0
  67. data/lib/ship_compliant/get_inventory_details.rb +31 -0
  68. data/lib/ship_compliant/get_inventory_details_result.rb +41 -0
  69. data/lib/ship_compliant/get_sales_order_extended.rb +23 -0
  70. data/lib/ship_compliant/get_sales_order_extended_result.rb +65 -0
  71. data/lib/ship_compliant/inventory_product.rb +95 -0
  72. data/lib/ship_compliant/order_search.rb +92 -0
  73. data/lib/ship_compliant/package.rb +13 -0
  74. data/lib/ship_compliant/product_attributes.rb +98 -0
  75. data/lib/ship_compliant/product_sales_tax_rate.rb +23 -0
  76. data/lib/ship_compliant/sales_tax_rate.rb +22 -0
  77. data/lib/ship_compliant/search_sales_order_summary.rb +30 -0
  78. data/lib/ship_compliant/search_sales_orders.rb +53 -0
  79. data/lib/ship_compliant/search_sales_orders_result.rb +106 -0
  80. data/lib/ship_compliant/shipment.rb +59 -0
  81. data/lib/ship_compliant/shipment_compliance.rb +28 -0
  82. data/lib/ship_compliant/shipment_sales_tax_rate.rb +15 -0
  83. data/lib/ship_compliant/version.rb +3 -0
  84. data/lib/ship_compliant/void_sales_order.rb +42 -0
  85. data/lib/ship_compliant/void_sales_order_result.rb +20 -0
  86. data/ship_compliant.gemspec +33 -0
  87. data/spec/fixtures/add_update_product.xml +22 -0
  88. data/spec/fixtures/check_compliance.xml +125 -0
  89. data/spec/fixtures/coreservice.wsdl +1341 -0
  90. data/spec/fixtures/search_sales_orders.xml +52 -0
  91. data/spec/fixtures/void_order_failure.xml +31 -0
  92. data/spec/fixtures/void_order_success.xml +22 -0
  93. data/spec/lib/ship_compliant/add_update_brand_result_spec.rb +7 -0
  94. data/spec/lib/ship_compliant/add_update_brand_spec.rb +58 -0
  95. data/spec/lib/ship_compliant/add_update_product_result_spec.rb +7 -0
  96. data/spec/lib/ship_compliant/add_update_product_spec.rb +52 -0
  97. data/spec/lib/ship_compliant/address/suggested_address_spec.rb +28 -0
  98. data/spec/lib/ship_compliant/address_spec.rb +123 -0
  99. data/spec/lib/ship_compliant/base_result_spec.rb +127 -0
  100. data/spec/lib/ship_compliant/channel_details_spec.rb +40 -0
  101. data/spec/lib/ship_compliant/check_compliance_result_spec.rb +135 -0
  102. data/spec/lib/ship_compliant/check_compliance_spec.rb +43 -0
  103. data/spec/lib/ship_compliant/client_spec.rb +73 -0
  104. data/spec/lib/ship_compliant/commit_sales_order_result_spec.rb +32 -0
  105. data/spec/lib/ship_compliant/commit_sales_order_spec.rb +38 -0
  106. data/spec/lib/ship_compliant/compliance_rule_spec.rb +47 -0
  107. data/spec/lib/ship_compliant/configuration_spec.rb +47 -0
  108. data/spec/lib/ship_compliant/error_result_spec.rb +47 -0
  109. data/spec/lib/ship_compliant/freight_sales_tax_rate_spec.rb +7 -0
  110. data/spec/lib/ship_compliant/get_inventory_details_result_spec.rb +87 -0
  111. data/spec/lib/ship_compliant/get_inventory_details_spec.rb +35 -0
  112. data/spec/lib/ship_compliant/get_sales_order_extended_result_spec.rb +84 -0
  113. data/spec/lib/ship_compliant/get_sales_order_extended_spec.rb +39 -0
  114. data/spec/lib/ship_compliant/inventory_product_spec.rb +116 -0
  115. data/spec/lib/ship_compliant/order_search_spec.rb +21 -0
  116. data/spec/lib/ship_compliant/package_spec.rb +26 -0
  117. data/spec/lib/ship_compliant/product_attributes_spec.rb +36 -0
  118. data/spec/lib/ship_compliant/product_sales_tax_rate_spec.rb +22 -0
  119. data/spec/lib/ship_compliant/sales_tax_rate_spec.rb +21 -0
  120. data/spec/lib/ship_compliant/search_sales_order_summary_spec.rb +56 -0
  121. data/spec/lib/ship_compliant/search_sales_orders_result_spec.rb +121 -0
  122. data/spec/lib/ship_compliant/search_sales_orders_spec.rb +42 -0
  123. data/spec/lib/ship_compliant/shipment_compliance_spec.rb +46 -0
  124. data/spec/lib/ship_compliant/shipment_sales_tax_rate_spec.rb +20 -0
  125. data/spec/lib/ship_compliant/shipment_spec.rb +106 -0
  126. data/spec/lib/ship_compliant/void_sales_order_result_spec.rb +7 -0
  127. data/spec/lib/ship_compliant/void_sales_order_spec.rb +41 -0
  128. data/spec/spec_helper.rb +50 -0
  129. metadata +366 -0
@@ -0,0 +1,102 @@
1
+ When(/^I check compliance with a missing product$/) do
2
+ VCR.use_cassette('compliance_missing_product') do
3
+ @compliance_status = ShipCompliant::CheckCompliance.of_sales_order({
4
+ 'AddressOption' => {
5
+ 'IgnoreStreetLevelErrors' => true,
6
+ 'RejectIfAddressSuggested' => 'false'
7
+ },
8
+ 'IncludeSalesTaxRates' => true,
9
+ 'PersistOption' => 'Null',
10
+ 'SalesOrder' => {
11
+ 'BillTo' => {
12
+ 'City' => 'Boulder',
13
+ 'Company' => 'ShipCompliant',
14
+ 'Country' => 'US',
15
+ 'DateOfBirth' => DateTime.new(1987, 8, 6),
16
+ 'Email' => 'emily@six88.com',
17
+ 'FirstName' => 'Emily',
18
+ 'LastName' => 'Sheehan',
19
+ 'Phone' => '303-996-1626',
20
+ 'State' => 'CO',
21
+ 'Street1' => '1877 Broadway St',
22
+ 'Street2' => 'SUITE 703',
23
+ 'Zip1' => 80304
24
+ },
25
+ 'CustomerKey' => 'd23c963b',
26
+ 'Discounts' => nil,
27
+ 'FulfillmentType' => 'Daily',
28
+ 'OrderType' => 'Internet',
29
+ 'Payments' => nil,
30
+ 'PurchaseDate' => DateTime.new(2014, 3, 12),
31
+ 'RegisterId' => 'cf3ee9',
32
+ 'SalesOrderKey' => '1006891',
33
+ 'SalesTaxCollected' => 0,
34
+ 'Shipments' => {
35
+ 'Shipment' => {
36
+ 'Discounts' => nil,
37
+ 'FulfillmentHouse' => 'InHouse',
38
+ 'Handling' => 0,
39
+ 'InsuredAmount' => 0,
40
+ 'LicenseRelationship' => 'Default',
41
+ 'Packages' => nil,
42
+ 'ShipDate' => DateTime.new(2014, 3, 15),
43
+ 'ShippingService' => 'UPS',
44
+ 'ShipmentItems' => [
45
+ {
46
+ 'ShipmentItem' => {
47
+ 'BrandKey' => 'DEN',
48
+ 'Discounts' => nil,
49
+ 'ProductKey' => '04CHRCAB75',
50
+ 'ProductQuantity' => 6,
51
+ 'ProductUnitPrice' => 76
52
+ }
53
+ },
54
+ {
55
+ 'ShipmentItem' => {
56
+ 'BrandKey' => 'DEN',
57
+ 'Discounts' => nil,
58
+ 'ProductKey' => 'Shoe',
59
+ 'ProductQuantity' => 1,
60
+ 'ProductUnitPrice' => 84.99
61
+ }
62
+ }
63
+ ],
64
+ 'ShipmentKey' => 1,
65
+ 'ShipmentStatus' => 'SentToFulfillment',
66
+ 'Shipping' => 15,
67
+ 'ShipTo' => {
68
+ 'City' => 'New York',
69
+ 'Company' => nil,
70
+ 'Country' => 'US',
71
+ 'County' => nil,
72
+ 'DateOfBirth' => DateTime.new(1987, 8, 6),
73
+ 'Email' => 'emily@six88.com',
74
+ 'Fax' => nil,
75
+ 'FirstName' => 'Emily',
76
+ 'LastName' => 'Sheehan',
77
+ 'Phone' => '7209375005',
78
+ 'State' => 'NY',
79
+ 'Street1' => '253 Broadway Ave',
80
+ 'Street2' => 'Floor 9',
81
+ 'Zip1' => 10007,
82
+ 'Zip2' => nil
83
+ }
84
+ }
85
+ },
86
+ 'Tags' => nil
87
+ }
88
+ })
89
+ end
90
+ end
91
+
92
+ Then(/^I should receive a product key error$/) do
93
+ @compliance_status.failure?.should be_true
94
+ @compliance_status.error_count.should == 1
95
+ error = @compliance_status.errors.first
96
+
97
+ error.code.should == 201
98
+ error.key.should == '1'
99
+ error.message.should == 'Product matching given BrandKey/ProductKey does not exist [DEN,Shoe].'
100
+ error.target.should == 'Shipment'
101
+ error.type.should == 'Validation'
102
+ end
@@ -0,0 +1,102 @@
1
+ When(/^I check compliance with a non\-compliant product$/) do
2
+ VCR.use_cassette('compliance_noncompliant_product') do
3
+ @compliance_status = ShipCompliant::CheckCompliance.of_sales_order({
4
+ 'AddressOption' => {
5
+ 'IgnoreStreetLevelErrors' => true,
6
+ 'RejectIfAddressSuggested' => 'false'
7
+ },
8
+ 'IncludeSalesTaxRates' => true,
9
+ 'PersistOption' => 'Null',
10
+ 'SalesOrder' => {
11
+ 'BillTo' => {
12
+ 'City' => 'Boulder',
13
+ 'Company' => 'ShipCompliant',
14
+ 'Country' => 'US',
15
+ 'DateOfBirth' => DateTime.new(1987, 8, 6),
16
+ 'Email' => 'emily@six88.com',
17
+ 'FirstName' => 'Emily',
18
+ 'LastName' => 'Sheehan',
19
+ 'Phone' => '303-996-1626',
20
+ 'State' => 'CO',
21
+ 'Street1' => '1877 Broadway St',
22
+ 'Street2' => 'SUITE 703',
23
+ 'Zip1' => 80304
24
+ },
25
+ 'CustomerKey' => 'd23c963b',
26
+ 'Discounts' => nil,
27
+ 'FulfillmentType' => 'Daily',
28
+ 'OrderType' => 'Internet',
29
+ 'Payments' => nil,
30
+ 'PurchaseDate' => DateTime.new(2014, 3, 12),
31
+ 'RegisterId' => 'cf3ee9',
32
+ 'SalesOrderKey' => '1006898',
33
+ 'SalesTaxCollected' => 0,
34
+ 'Shipments' => {
35
+ 'Shipment' => {
36
+ 'Discounts' => nil,
37
+ 'FulfillmentHouse' => 'WineShipping',
38
+ 'Handling' => 0,
39
+ 'InsuredAmount' => 0,
40
+ 'LicenseRelationship' => 'Default',
41
+ 'Packages' => nil,
42
+ 'ShipDate' => DateTime.new(2014, 3, 15),
43
+ 'ShippingService' => 'UPS',
44
+ 'ShipmentItems' => [
45
+ {
46
+ 'ShipmentItem' => {
47
+ 'BrandKey' => 'DEN',
48
+ 'Discounts' => nil,
49
+ 'ProductKey' => '09OTBC75',
50
+ 'ProductQuantity' => 2,
51
+ 'ProductUnitPrice' => 15.99
52
+ }
53
+ },
54
+ {
55
+ 'ShipmentItem' => {
56
+ 'BrandKey' => 'DEN',
57
+ 'Discounts' => nil,
58
+ 'ProductKey' => 'SNFL13',
59
+ 'ProductQuantity' => 2,
60
+ 'ProductUnitPrice' => 22.99
61
+ }
62
+ }
63
+ ],
64
+ 'ShipmentKey' => 1,
65
+ 'ShipmentStatus' => 'SentToFulfillment',
66
+ 'Shipping' => 15,
67
+ 'ShipTo' => {
68
+ 'City' => 'Meridian',
69
+ 'Company' => 'SMITH HOUSING',
70
+ 'Country' => 'US',
71
+ 'DateOfBirth' => DateTime.new(1987, 1, 1),
72
+ 'Email' => 'bob.smith@smith.com',
73
+ 'FirstName' => 'J Robert',
74
+ 'LastName' => 'Love',
75
+ 'Phone' => '770-551-0007',
76
+ 'State' => 'ID',
77
+ 'Street1' => '405 E Fairview Ave',
78
+ 'Zip1' => 83642,
79
+ }
80
+ }
81
+ },
82
+ 'Tags' => nil
83
+ }
84
+ })
85
+ end
86
+ end
87
+
88
+ Then(/^I should receive error messages$/) do
89
+ @compliance_status.compliant?.should be_false
90
+ shipment = @compliance_status.compliance_rules_for_shipment('1')
91
+ errors = shipment.rules.select { |r| !r.compliant? }
92
+
93
+ errors.map(&:rule_description).should == [
94
+ 'Shipments to this region require an excise tax of $.45 per 1 gallon on offsite sales of wine due within 20 days after every month. For a summary of the taxes in the state, click here.',
95
+ 'Shipments to this region for offsite sales require the following shipping label: Alcoholic Beverages - Cannot deliver to intoxicated persons.',
96
+ 'Shipments to this region require sales tax for offsite sales shipments. For a summary of the taxes in the state, click here.',
97
+ 'Shipments to this region have a per customer volume limit of 24 cases per individual per calendar year. The volume will be calculated from combined onsite and offsite sales.',
98
+ 'A license is required for shipping offsite sales and must be renewed every 1 year. The cost of this license is $50.00. Note: Renewal fee is $25..',
99
+ 'Suppliers shipping to this region must submit reporting data for offsite sales due within 1 month after every year. This region requires a periodic report even if no shipments have been made. The following information should be included within the report: ShipTo Name, ShipTo Address, BillTo Name, Type of Product (Eg: Wine, Sparkling Wine..), Volume of Product, Unit Price, Date of Purchase, Date of Shipment, Invoice Number. .',
100
+ 'Only wines of your own production or bottling are allowed to be shipped to this region. Note: Authorized direct shipping includes "sales by a winery of wine produced or bottled by the winery."..'
101
+ ]
102
+ end
@@ -0,0 +1,8 @@
1
+ Given(/^I've added my credentials$/) do
2
+ ShipCompliant.configure do |c|
3
+ c.partner_key = ENV.fetch('SHIP_COMPLIANT_KEY')
4
+ c.username = ENV.fetch('SHIP_COMPLIANT_USER')
5
+ c.password = ENV.fetch('SHIP_COMPLIANT_PASS')
6
+ c.log = false
7
+ end
8
+ end
@@ -0,0 +1,36 @@
1
+ When(/^I get inventory details with everthing$/) do
2
+ VCR.use_cassette('inventory_details_for_everything') do
3
+ @inventory_results = ShipCompliant::GetInventoryDetails.call({
4
+ brand_key: 'DEN',
5
+ fulfillment_location: 'WineShipping',
6
+ inventory_type: 'All',
7
+ product_key: '04CHRCAB75'
8
+ })
9
+ end
10
+ end
11
+
12
+ Then(/^I should be able to get the product information$/) do
13
+ @inventory_results.products_for_location('WineShipping').should be_kind_of(Array)
14
+ @inventory_results.products_for_location('WineShipping').length.should == 1
15
+ product = @inventory_results.products_for_location('WineShipping').first
16
+
17
+ product.default_case.should == '12x750 mL'
18
+ product.description.should == 'Capital Hill Reserve Cabernet'
19
+ product.fulfillment_sku.should == '04CHRCAB75'
20
+ product.percent_alcohol.should == 13
21
+ product.product_key.should == '04CHRCAB75'
22
+ product.product_type.should == 'Wine'
23
+ product.unit_price.should == 0
24
+ product.vintage.should == 2011
25
+ product.volume_amount.should == 750
26
+ product.volume_ml.should == 750
27
+ product.volume_unit.should == 'Milliliter'
28
+ end
29
+
30
+ Then(/^I should inventory levels for a product$/) do
31
+ product = @inventory_results.products_for_location('WineShipping').first
32
+ product.inventory_levels.should == {
33
+ available: 25,
34
+ reserved: 25
35
+ }
36
+ end
@@ -0,0 +1,140 @@
1
+ When(/^I add a new product with invalid brand$/) do
2
+ VCR.use_cassette('product_invalid_brand') do
3
+ @product_response = ShipCompliant::AddUpdateProduct.product({
4
+ bottle_size_ms: 750,
5
+ brand_key: 'DENSNW',
6
+ default_case: 12,
7
+ default_wholesale_case_price: 270,
8
+ description: 'Denver Snow Flake Cab 2013',
9
+ percent_alcohol: 14.1,
10
+ product_distribution: 'Both',
11
+ product_key: 'SNFL13',
12
+ product_type: 'Wine',
13
+ unit_price: 49.99,
14
+ varietal: 'Cabernet Sauvignon',
15
+ vintage: 2013,
16
+ volume_amount: 750,
17
+ volume_unit: 'milliliter'
18
+ }, update_mode: 'ErrorOnExisting')
19
+ end
20
+ end
21
+
22
+ When(/^I add a new product$/) do
23
+ VCR.use_cassette('product_valid_brand') do
24
+ @product_response = ShipCompliant::AddUpdateProduct.product({
25
+ bottle_size_ms: 750,
26
+ brand_key: 'DEN',
27
+ default_case: 12,
28
+ default_wholesale_case_price: 270,
29
+ description: 'Denver Snow Flake Cab 2013',
30
+ percent_alcohol: 14.1,
31
+ product_distribution: 'Both',
32
+ product_key: 'SNFL13',
33
+ product_type: 'Wine',
34
+ unit_price: 49.99,
35
+ varietal: 'Cabernet Sauvignon',
36
+ vintage: 2013,
37
+ volume_amount: 750,
38
+ volume_unit: 'milliliter'
39
+ }, update_mode: 'ErrorOnExisting')
40
+ end
41
+ end
42
+
43
+ When(/^I add a product that already exists$/) do
44
+ VCR.use_cassette('product_already_exists') do
45
+ @product_response = ShipCompliant::AddUpdateProduct.product({
46
+ bottle_size_ms: 750,
47
+ brand_key: 'DEN',
48
+ default_case: 12,
49
+ default_wholesale_case_price: 270,
50
+ description: 'Denver Snow Flake Cab 2013',
51
+ percent_alcohol: 14.1,
52
+ product_distribution: 'Both',
53
+ product_key: 'SNFL13',
54
+ product_type: 'Wine',
55
+ unit_price: 49.99,
56
+ varietal: 'Cabernet Sauvignon',
57
+ vintage: 2013,
58
+ volume_amount: 750,
59
+ volume_unit: 'milliliter'
60
+ }, update_mode: 'ErrorOnExisting')
61
+ end
62
+ end
63
+
64
+ When(/^I update a product$/) do
65
+ VCR.use_cassette('update_product') do
66
+ @product_response = ShipCompliant::AddUpdateProduct.product({
67
+ bottle_size_ms: 750,
68
+ brand_key: 'DEN',
69
+ default_case: 12,
70
+ default_wholesale_case_price: 270,
71
+ description: 'Denver Snow Flake Cab 2013',
72
+ percent_alcohol: 14.1,
73
+ product_distribution: 'Both',
74
+ product_key: 'SNFL13',
75
+ product_type: 'Wine',
76
+ unit_price: 49.99,
77
+ varietal: 'Cabernet Sauvignon',
78
+ vintage: 2013,
79
+ volume_amount: 750,
80
+ volume_unit: 'milliliter'
81
+ }, update_mode: 'UpdateExisting')
82
+ end
83
+ end
84
+
85
+ When(/^I ignore existing product on update$/) do
86
+ VCR.use_cassette('ignore_existing_product') do
87
+ @product_response = ShipCompliant::AddUpdateProduct.product({
88
+ bottle_size_ms: 750,
89
+ brand_key: 'DEN',
90
+ default_case: 12,
91
+ default_wholesale_case_price: 270,
92
+ description: 'Denver Snow Flake Cab 2013',
93
+ percent_alcohol: 14.1,
94
+ product_distribution: 'Both',
95
+ product_key: 'SNFL13',
96
+ product_type: 'Wine',
97
+ unit_price: 49.99,
98
+ varietal: 'Cabernet Sauvignon',
99
+ vintage: 2013,
100
+ volume_amount: 750,
101
+ volume_unit: 'milliliter'
102
+ }, update_mode: 'IgnoreExisting')
103
+ end
104
+ end
105
+
106
+ Then(/^the product should have been created$/) do
107
+ @product_response.success?.should be_true
108
+ end
109
+
110
+ Then(/^I should get a message that the product was updated$/) do
111
+ @product_response.success?.should be_true
112
+ end
113
+
114
+ Then(/^I should get an error message for the missing brand$/) do
115
+ product_response.failure?.should be_true
116
+ product_response.errors_count.should == 1
117
+
118
+ error = product_response.errors[0]
119
+ error.code.should == 100
120
+ error.key.should == 'SNFL13'
121
+ error.message.should == 'Brand does not exist [DENSNW].'
122
+ error.target.should == 'Product'
123
+ error.type.should == 'Validation'
124
+ end
125
+
126
+ Then(/^I should get an error for already defined product$/) do
127
+ product_response.failure?.should be_true
128
+ product_response.errors_count.should == 1
129
+
130
+ error = product_response.errors[0]
131
+ error.code.should == 2707
132
+ error.key.should == 'SNFL13'
133
+ error.message.should == 'Product already exists.'
134
+ error.target.should == 'Product'
135
+ error.type.should == 'Validation'
136
+ end
137
+
138
+ def product_response
139
+ @product_response #.to_hash[:add_update_product_response][:add_update_product_result]
140
+ end
@@ -0,0 +1,79 @@
1
+ When(/^I search for order information$/) do
2
+ VCR.use_cassette('sales_order_extended') do
3
+ @order_result = ShipCompliant::GetSalesOrderExtended.by_order_key('1006890')
4
+ end
5
+ end
6
+
7
+ When(/^I search for an invalid order$/) do
8
+ VCR.use_cassette('sales_order_missing') do
9
+ @order_result = ShipCompliant::GetSalesOrderExtended.by_order_key('order-404')
10
+ end
11
+ end
12
+
13
+ Then(/^I should receive shipment compliance statuses$/) do
14
+ shipment_compliance = @order_result.compliance_rules_for_shipment('1')
15
+ shipment_compliance.compliant?.should be_true
16
+ shipment_compliance.rules.should == []
17
+ end
18
+
19
+ Then(/^I should receive billing information$/) do
20
+ billing = @order_result.bill_to
21
+ billing.should be_kind_of(ShipCompliant::Address)
22
+
23
+ billing.city.should == 'St. Paul'
24
+ billing.company.should == 'SMITH HOUSING'
25
+ billing.country.should == 'US'
26
+ billing.county.should be_nil
27
+ billing.date_of_birth.should == DateTime.new(1987, 1, 1)
28
+ billing.email.should == 'bob.smith@smith.com'
29
+ billing.fax.should be_nil
30
+ billing.first_name.should == 'J Robert'
31
+ billing.last_name.should == 'Love'
32
+ billing.phone.should == '(770) 551-0007'
33
+ billing.state.should == 'MN'
34
+ billing.street1.should == '444 Cedar Street'
35
+ billing.street2.should be_nil
36
+ billing.zip1.should == 55101
37
+ billing.zip2.should be_nil
38
+ end
39
+
40
+ Then(/^I should receive shipment information$/) do
41
+ shipment = @order_result.find_shipment('1')
42
+
43
+ shipment.fulfillment_house.should == 'WineShipping'
44
+ shipment.fulfillment_exception_reason.should be_nil
45
+ shipment.fulfillment_exception_type.should == 'None'
46
+ shipment.fulfillment_status.should == 'Accepted'
47
+
48
+ shipment.handling.should == 0
49
+ shipment.insured_amount.should == 0
50
+ shipment.shipping.should == 30
51
+
52
+ shipment.ship_date.should == DateTime.new(2014, 2, 20, 20, 6)
53
+ shipment.shipment_status.should == 'Delivered'
54
+ shipment.shipping_service.should == 'UP2'
55
+ shipment.special_instructions.should be_nil
56
+
57
+ # Shipment Packages
58
+ package = shipment.packages.first
59
+ package.tracking_number.should == '1Z875F62A890362872'
60
+ package.tracking_status.should == 'Delivered'
61
+
62
+ # Ship To Address
63
+ shipment.ship_to.should be_kind_of(ShipCompliant::Address)
64
+ end
65
+
66
+ Then(/^I should receive order channel details$/) do
67
+ details = @order_result.channel_details
68
+ details.order_channel.should == 'MyOrders'
69
+ end
70
+
71
+ Then(/^I should receive an error that the order doesn't exist$/) do
72
+ @order_result.failure?.should be_true
73
+ error = @order_result.errors.first
74
+
75
+ error.code.should == 200
76
+ error.message.should == 'SalesOrder does not exist [order-404].'
77
+ error.target.should == 'Null'
78
+ error.type.should == 'Validation'
79
+ end