ship_compliant 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 (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,52 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
3
+ <soap:Header>
4
+ <wsa:Action>action</wsa:Action>
5
+ <wsa:MessageID>message-id</wsa:MessageID>
6
+ <wsa:RelatesTo>relates-to</wsa:RelatesTo>
7
+ <wsa:To>http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:To>
8
+ <wsse:Security>
9
+ <wsu:Timestamp wsu:Id="Timestamp-id">
10
+ <wsu:Created>2014-03-11T15:08:12Z</wsu:Created>
11
+ <wsu:Expires>2014-03-11T15:13:12Z</wsu:Expires>
12
+ </wsu:Timestamp>
13
+ </wsse:Security>
14
+ </soap:Header>
15
+ <soap:Body>
16
+ <SearchSalesOrdersResponse xmlns="http://ws.shipcompliant.com/">
17
+ <SearchSalesOrdersResult>
18
+ <CountMoreSalesOrdersAvailable>0</CountMoreSalesOrdersAvailable>
19
+ <CountSalesOrdersReturned>1</CountSalesOrdersReturned>
20
+ <PagingCookie>paging-cookie</PagingCookie>
21
+ <PagingCookieExpires>2014-01-02T09:07:55-06:00</PagingCookieExpires>
22
+ <ResponseStatus>Success</ResponseStatus>
23
+ <SalesOrders>
24
+ <SalesOrderSummary>
25
+ <PurchaseDate>2014-03-10T00:00:00+00:00</PurchaseDate>
26
+ <SalesOrderKey>ONL-1</SalesOrderKey>
27
+ <Shipments>
28
+ <ShipmentSummary>
29
+ <ComplianceStatus>LegacyCommitted</ComplianceStatus>
30
+ <FulfillmentExceptionReason/>
31
+ <FulfillmentExceptionType>None</FulfillmentExceptionType>
32
+ <FulfillmentHouse/>
33
+ <FulfillmentStatus>None</FulfillmentStatus>
34
+ <Packages/>
35
+ <RequestedShipDate>2014-03-11T00:00:00+00:00</RequestedShipDate>
36
+ <ShipDate>2014-03-11T00:00:00+00:00</ShipDate>
37
+ <ShipmentKey>0</ShipmentKey>
38
+ <ShipmentStatus>InProcess</ShipmentStatus>
39
+ <ShipTo>
40
+ <FirstName>John</FirstName>
41
+ <LastName>Doe</LastName>
42
+ <Zip1>90210</Zip1>
43
+ </ShipTo>
44
+ </ShipmentSummary>
45
+ </Shipments>
46
+ <Tags/>
47
+ </SalesOrderSummary>
48
+ </SalesOrders>
49
+ </SearchSalesOrdersResult>
50
+ </SearchSalesOrdersResponse>
51
+ </soap:Body>
52
+ </soap:Envelope>
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
3
+ <soap:Header>
4
+ <wsa:Action>http://ws.shipcompliant.com/VoidSalesOrderResponse</wsa:Action>
5
+ <wsa:MessageID>uuid:ebdc1f5c-5f39-44b3-92c9-a9986b18fd06</wsa:MessageID>
6
+ <wsa:RelatesTo>uuid:2859b2a3-d425-46ab-befd-10db2cad7b79</wsa:RelatesTo>
7
+ <wsa:To>http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:To>
8
+ <wsse:Security>
9
+ <wsu:Timestamp wsu:Id="Timestamp-0b819aaf-491d-475b-846a-81de016274e9">
10
+ <wsu:Created>2014-03-12T01:19:43Z</wsu:Created>
11
+ <wsu:Expires>2014-03-12T01:24:43Z</wsu:Expires>
12
+ </wsu:Timestamp>
13
+ </wsse:Security>
14
+ </soap:Header>
15
+ <soap:Body>
16
+ <VoidSalesOrderResponse xmlns="http://ws.shipcompliant.com/">
17
+ <VoidSalesOrderResult>
18
+ <Errors>
19
+ <Error>
20
+ <Code>200</Code>
21
+ <Key>ONS-1</Key>
22
+ <Message>SalesOrder does not exist [ONS-1].</Message>
23
+ <Target>SalesOrder</Target>
24
+ <Type>Validation</Type>
25
+ </Error>
26
+ </Errors>
27
+ <ResponseStatus>Failure</ResponseStatus>
28
+ </VoidSalesOrderResult>
29
+ </VoidSalesOrderResponse>
30
+ </soap:Body>
31
+ </soap:Envelope>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
3
+ <soap:Header>
4
+ <wsa:Action>http://ws.shipcompliant.com/VoidSalesOrderResponse</wsa:Action>
5
+ <wsa:MessageID>uuid:a894e5e3-90b9-421b-af83-d2b7ed384374</wsa:MessageID>
6
+ <wsa:RelatesTo>uuid:96461b87-360d-41b6-a626-a00d72e08736</wsa:RelatesTo>
7
+ <wsa:To>http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous</wsa:To>
8
+ <wsse:Security>
9
+ <wsu:Timestamp wsu:Id="Timestamp-adc998a5-2ef8-44ff-8ead-8fae965f5031">
10
+ <wsu:Created>2014-03-12T01:16:52Z</wsu:Created>
11
+ <wsu:Expires>2014-03-12T01:21:52Z</wsu:Expires>
12
+ </wsu:Timestamp>
13
+ </wsse:Security>
14
+ </soap:Header>
15
+ <soap:Body>
16
+ <VoidSalesOrderResponse xmlns="http://ws.shipcompliant.com/">
17
+ <VoidSalesOrderResult>
18
+ <ResponseStatus>Success</ResponseStatus>
19
+ </VoidSalesOrderResult>
20
+ </VoidSalesOrderResponse>
21
+ </soap:Body>
22
+ </soap:Envelope>
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ module ShipCompliant
4
+ describe AddUpdateBrandResult do
5
+ it_behaves_like "BaseResult"
6
+ end
7
+ end
@@ -0,0 +1,58 @@
1
+ require "spec_helper"
2
+
3
+ module ShipCompliant
4
+ describe AddUpdateBrand do
5
+
6
+ before { savon.mock! }
7
+ after { savon.unmock! }
8
+
9
+ let(:message) do
10
+ {
11
+ 'Request' => {
12
+ 'Security' => {
13
+ 'PartnerKey' => 'abc-123',
14
+ 'Username' => 'bob@example.com',
15
+ 'Password' => 'secret'
16
+ },
17
+ 'Brand' => {
18
+ 'Key' => 'WNDFL',
19
+ 'Name' => 'Wonderful',
20
+ 'Owner' => {
21
+ 'Name' => 'Sam'
22
+ }
23
+ },
24
+ 'UpdateMode' => 'DoWackaDo'
25
+ }
26
+ }
27
+ end
28
+ let(:response) { File.read('spec/fixtures/add_update_product.xml') }
29
+ context "brand" do
30
+
31
+ it "queries the client with an update mode" do
32
+ savon.expects(:add_update_brand)
33
+ .with(message: message).returns(response)
34
+
35
+ result = AddUpdateBrand.brand({
36
+ key: 'WNDFL',
37
+ name: 'Wonderful',
38
+ owner: { name: 'Sam' }
39
+ }, update_mode: 'DoWackaDo')
40
+
41
+ result.should be_kind_of(AddUpdateBrandResult)
42
+ end
43
+
44
+ it "update mode defaults to ErrorOnExisting" do
45
+ message['Request']['UpdateMode'] = 'ErrorOnExisting'
46
+ savon.expects(:add_update_brand)
47
+ .with(message: message).returns(response)
48
+
49
+ AddUpdateBrand.brand({
50
+ key: 'WNDFL',
51
+ name: 'Wonderful',
52
+ owner: { name: 'Sam' }
53
+ })
54
+ end
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ module ShipCompliant
4
+ describe AddUpdateProductResult do
5
+ it_behaves_like "BaseResult"
6
+ end
7
+ end
@@ -0,0 +1,52 @@
1
+ require "spec_helper"
2
+
3
+ module ShipCompliant
4
+ describe AddUpdateProduct do
5
+
6
+ before { savon.mock! }
7
+ after { savon.unmock! }
8
+
9
+ let(:message) do
10
+ {
11
+ 'Request' => {
12
+ 'Security' => {
13
+ 'PartnerKey' => 'abc-123',
14
+ 'Username' => 'bob@example.com',
15
+ 'Password' => 'secret'
16
+ },
17
+ 'Product' => {
18
+ 'BottleSizeML' => 123,
19
+ 'DefaultWholesaleCasePrice' => 150
20
+ },
21
+ 'UpdateMode' => 'DoWackaDo'
22
+ }
23
+ }
24
+ end
25
+ let(:response) { File.read('spec/fixtures/add_update_product.xml') }
26
+
27
+ context "product" do
28
+ it "queries the client with product an update mode" do
29
+ AddUpdateProduct.stub(:add_update_product) { {} }
30
+
31
+ result = AddUpdateProduct.product({
32
+ bottle_size_ml: 123,
33
+ default_wholesale_case_price: 150
34
+ }, update_mode: 'DoWackaDo')
35
+
36
+ result.should be_kind_of(AddUpdateProductResult)
37
+ end
38
+
39
+ it "update mode defaults to ErrorOnExisting" do
40
+ message['Request']['UpdateMode'] = 'ErrorOnExisting'
41
+ savon.expects(:add_update_product)
42
+ .with(message: message).returns(response)
43
+
44
+ AddUpdateProduct.product({
45
+ bottle_size_ml: 123,
46
+ default_wholesale_case_price: 150
47
+ })
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ module ShipCompliant
4
+ describe SuggestedAddress do
5
+
6
+ it { should be_kind_of(Address) }
7
+
8
+ context "details" do
9
+ it "gets the details" do
10
+ subject.details.should == { address_details: true }
11
+ end
12
+ end
13
+
14
+ context "parts" do
15
+ it "gets the parts" do
16
+ subject.parts.should == { address_parts: true }
17
+ end
18
+ end
19
+
20
+ subject do
21
+ SuggestedAddress.new(
22
+ details: { address_details: true },
23
+ parts: { address_parts: true }
24
+ )
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,123 @@
1
+ require "spec_helper"
2
+
3
+ module ShipCompliant
4
+ describe Address do
5
+
6
+ context "city" do
7
+ it "gets the city" do
8
+ subject.city.should == 'A City'
9
+ end
10
+ end
11
+
12
+ context "county" do
13
+ it "gets the county" do
14
+ subject.county.should == 'A County'
15
+ end
16
+ end
17
+
18
+ context "state" do
19
+ it "gets the state" do
20
+ subject.state.should == 'A State'
21
+ end
22
+ end
23
+
24
+ context "country" do
25
+ it "gets the country" do
26
+ subject.country.should == 'A Country'
27
+ end
28
+ end
29
+
30
+ context "street1" do
31
+ it "gets street1" do
32
+ subject.street1.should == 'Street 1'
33
+ end
34
+ end
35
+
36
+ context "street2" do
37
+ it "gets street2" do
38
+ subject.street2.should == 'Street 2'
39
+ end
40
+ end
41
+
42
+ context "zip1" do
43
+ it "gets zip1" do
44
+ subject.zip1.should == 12345
45
+ end
46
+ end
47
+
48
+ context "zip2" do
49
+ it "gets zip2" do
50
+ subject.zip2.should == 1234
51
+ end
52
+
53
+ it "returns nil when empty" do
54
+ subject.address[:zip2] = nil
55
+ subject.zip2.should be_nil
56
+ end
57
+ end
58
+
59
+ context "company" do
60
+ it "gets company" do
61
+ subject.company.should == 'Dippin Dots'
62
+ end
63
+ end
64
+
65
+ context "date_of_birth" do
66
+ it "gets date_of_birth" do
67
+ subject.date_of_birth.should == Date.new(1967, 8, 12)
68
+ end
69
+ end
70
+
71
+ context "email" do
72
+ it "gets email" do
73
+ subject.email.should == 'sogood@getdots.com'
74
+ end
75
+ end
76
+
77
+ context "fax" do
78
+ it "gets fax" do
79
+ subject.fax.should == '(555) 123-8901'
80
+ end
81
+ end
82
+
83
+ context "phone" do
84
+ it "gets phone" do
85
+ subject.phone.should == '(555) 123-4567'
86
+ end
87
+ end
88
+
89
+ context "first_name" do
90
+ it "gets first_name" do
91
+ subject.first_name.should == 'Lt.'
92
+ end
93
+ end
94
+
95
+ context "last_name" do
96
+ it "gets last_name" do
97
+ subject.last_name.should == 'Columbo'
98
+ end
99
+ end
100
+
101
+ subject do
102
+ Address.new(
103
+ city: 'A City',
104
+ county: 'A County',
105
+ country: 'A Country',
106
+ state: 'A State',
107
+ street1: 'Street 1',
108
+ street2: 'Street 2',
109
+ zip1: '12345',
110
+ zip2: '1234',
111
+
112
+ company: 'Dippin Dots',
113
+ date_of_birth: Date.new(1967, 8, 12),
114
+ email: 'sogood@getdots.com',
115
+ fax: '(555) 123-8901',
116
+ phone: '(555) 123-4567',
117
+ first_name: 'Lt.',
118
+ last_name: 'Columbo'
119
+ )
120
+ end
121
+
122
+ end
123
+ end
@@ -0,0 +1,127 @@
1
+ require "spec_helper"
2
+
3
+ module ShipCompliant
4
+ class FauxResult < Struct.new(:response)
5
+ include BaseResult
6
+ end
7
+ end
8
+
9
+ module ShipCompliant
10
+ describe BaseResult do
11
+
12
+ let(:success_message) { {response_status: "Success"} }
13
+ let(:failure_message) do
14
+ {
15
+ errors: {
16
+ error: {
17
+ code: "404",
18
+ key: "OrderId",
19
+ message: "I'm smarter than the average bear, Boo Boo",
20
+ target: "SalesOrder",
21
+ type: "Validation"
22
+ }
23
+ },
24
+ response_status: "Failure"
25
+ }
26
+ end
27
+
28
+ context "success?" do
29
+ it "returns true for successful response status" do
30
+ result = FauxResult.new(success_message)
31
+ result.success?.should be_true
32
+ end
33
+
34
+ it "returns false for failed response status" do
35
+ result = FauxResult.new(failure_message)
36
+ result.success?.should be_false
37
+ end
38
+ end
39
+
40
+ context "failure?" do
41
+ it "returns opposite of success?" do
42
+ result = FauxResult.new({})
43
+ result.stub(:success?) { false }
44
+ result.failure?.should be_true
45
+ end
46
+ end
47
+
48
+ context "errors" do
49
+ it "returns an array of errors" do
50
+ result = FauxResult.new(failure_message)
51
+ result.errors.should == [
52
+ ErrorResult.new({
53
+ code: "404",
54
+ key: "OrderId",
55
+ message: "I'm smarter than the average bear, Boo Boo",
56
+ target: "SalesOrder",
57
+ type: "Validation"
58
+ })
59
+ ]
60
+ end
61
+
62
+ it "doesn't break when errors is already an array" do
63
+ result = FauxResult.new({
64
+ response_status: 'Failure',
65
+ errors: [
66
+ {error: { code: '404' }},
67
+ {error: { code: '500' }}
68
+ ]
69
+ })
70
+
71
+ result.errors.should == [
72
+ ErrorResult.new(code: '404'),
73
+ ErrorResult.new(code: '500')
74
+ ]
75
+ end
76
+
77
+ it "returns an empty array for successful response" do
78
+ result = FauxResult.new(success_message)
79
+ result.errors.should == []
80
+ end
81
+ end
82
+
83
+ context "errors_count" do
84
+ it "counts the number of errors" do
85
+ result = FauxResult.new({})
86
+ result.stub(:errors) { [1, 2, 3 ] }
87
+ result.errors_count.should == 3
88
+ end
89
+ end
90
+
91
+ # context "error_message" do
92
+ # it "gets the error message" do
93
+ # result = FauxResult.new(failure_message)
94
+ # result.error_message.should == "I'm smarter than the average bear, Boo Boo"
95
+ # end
96
+
97
+ # it "returns nil when successful" do
98
+ # result = FauxResult.new(success_message)
99
+ # result.error_message.should be_nil
100
+ # end
101
+ # end
102
+
103
+ # context "error_code" do
104
+ # it "gets the error code" do
105
+ # result = FauxResult.new(failure_message)
106
+ # result.error_code.should == 200
107
+ # end
108
+
109
+ # it "returns 0 when successful" do
110
+ # result = FauxResult.new(success_message)
111
+ # result.error_code.should == 0
112
+ # end
113
+ # end
114
+
115
+ # context "error_key" do
116
+ # it "gets the error key" do
117
+ # result = FauxResult.new(failure_message)
118
+ # result.error_key.should == "OrderId"
119
+ # end
120
+
121
+ # it "returns nil when successful" do
122
+ # result = FauxResult.new(success_message)
123
+ # result.error_key.should be_nil
124
+ # end
125
+ # end
126
+ end
127
+ end