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,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