cxml-ruby 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +23 -0
  3. data/.gitignore +14 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +175 -0
  6. data/Gemfile +2 -0
  7. data/LICENSE +18 -0
  8. data/README.md +94 -0
  9. data/Rakefile +6 -0
  10. data/cxml-ruby.gemspec +27 -0
  11. data/lib/cxml/accounting.rb +27 -0
  12. data/lib/cxml/additional_cost.rb +10 -0
  13. data/lib/cxml/additional_deduction.rb +12 -0
  14. data/lib/cxml/address.rb +16 -0
  15. data/lib/cxml/bill_to.rb +10 -0
  16. data/lib/cxml/browser_form_post.rb +13 -0
  17. data/lib/cxml/charge.rb +9 -0
  18. data/lib/cxml/classification.rb +9 -0
  19. data/lib/cxml/confirmation_header.rb +16 -0
  20. data/lib/cxml/confirmation_item.rb +14 -0
  21. data/lib/cxml/confirmation_request.rb +25 -0
  22. data/lib/cxml/confirmation_status.rb +32 -0
  23. data/lib/cxml/contact.rb +16 -0
  24. data/lib/cxml/country.rb +9 -0
  25. data/lib/cxml/credential.rb +49 -0
  26. data/lib/cxml/credential_mac.rb +26 -0
  27. data/lib/cxml/deducted_price.rb +9 -0
  28. data/lib/cxml/deduction_amount.rb +9 -0
  29. data/lib/cxml/description.rb +9 -0
  30. data/lib/cxml/discount.rb +10 -0
  31. data/lib/cxml/discount_percent.rb +9 -0
  32. data/lib/cxml/distribution.rb +11 -0
  33. data/lib/cxml/document.rb +71 -0
  34. data/lib/cxml/document_node.rb +126 -0
  35. data/lib/cxml/document_reference.rb +9 -0
  36. data/lib/cxml/due_amount.rb +9 -0
  37. data/lib/cxml/email.rb +10 -0
  38. data/lib/cxml/errors.rb +7 -0
  39. data/lib/cxml/extrinsic.rb +10 -0
  40. data/lib/cxml/from.rb +9 -0
  41. data/lib/cxml/gross_amount.rb +9 -0
  42. data/lib/cxml/header.rb +29 -0
  43. data/lib/cxml/id_reference.rb +13 -0
  44. data/lib/cxml/invoice_detail_discount.rb +13 -0
  45. data/lib/cxml/invoice_detail_header_indicator.rb +11 -0
  46. data/lib/cxml/invoice_detail_header_order.rb +24 -0
  47. data/lib/cxml/invoice_detail_item.rb +55 -0
  48. data/lib/cxml/invoice_detail_item_reference.rb +17 -0
  49. data/lib/cxml/invoice_detail_line_indicator.rb +14 -0
  50. data/lib/cxml/invoice_detail_line_shipping.rb +11 -0
  51. data/lib/cxml/invoice_detail_line_special_handling.rb +11 -0
  52. data/lib/cxml/invoice_detail_order.rb +24 -0
  53. data/lib/cxml/invoice_detail_order_info.rb +10 -0
  54. data/lib/cxml/invoice_detail_order_summary.rb +32 -0
  55. data/lib/cxml/invoice_detail_request.rb +40 -0
  56. data/lib/cxml/invoice_detail_request_header.rb +54 -0
  57. data/lib/cxml/invoice_detail_shipping.rb +27 -0
  58. data/lib/cxml/invoice_detail_summary.rb +18 -0
  59. data/lib/cxml/invoice_id_info.rb +10 -0
  60. data/lib/cxml/invoice_partner.rb +10 -0
  61. data/lib/cxml/item_detail.rb +27 -0
  62. data/lib/cxml/item_id.rb +10 -0
  63. data/lib/cxml/item_in.rb +14 -0
  64. data/lib/cxml/item_out.rb +17 -0
  65. data/lib/cxml/master_agreement_reference.rb +9 -0
  66. data/lib/cxml/message.rb +13 -0
  67. data/lib/cxml/modification.rb +15 -0
  68. data/lib/cxml/modification_detail.rb +16 -0
  69. data/lib/cxml/modifications.rb +23 -0
  70. data/lib/cxml/money.rb +35 -0
  71. data/lib/cxml/name.rb +9 -0
  72. data/lib/cxml/net_amount.rb +9 -0
  73. data/lib/cxml/order_reference.rb +12 -0
  74. data/lib/cxml/order_request.rb +33 -0
  75. data/lib/cxml/order_request_header.rb +66 -0
  76. data/lib/cxml/parser.rb +37 -0
  77. data/lib/cxml/payment_term.rb +28 -0
  78. data/lib/cxml/period.rb +10 -0
  79. data/lib/cxml/postal_address.rb +35 -0
  80. data/lib/cxml/protocol.rb +57 -0
  81. data/lib/cxml/punch_out_order_message.rb +33 -0
  82. data/lib/cxml/punch_out_order_message_header.rb +20 -0
  83. data/lib/cxml/punch_out_setup_request.rb +31 -0
  84. data/lib/cxml/punch_out_setup_response.rb +9 -0
  85. data/lib/cxml/request.rb +21 -0
  86. data/lib/cxml/response.rb +20 -0
  87. data/lib/cxml/segment.rb +12 -0
  88. data/lib/cxml/sender.rb +10 -0
  89. data/lib/cxml/ship_to.rb +10 -0
  90. data/lib/cxml/shipping.rb +10 -0
  91. data/lib/cxml/shipping_amount.rb +10 -0
  92. data/lib/cxml/special_handling_amount.rb +11 -0
  93. data/lib/cxml/start_page.rb +13 -0
  94. data/lib/cxml/state.rb +9 -0
  95. data/lib/cxml/status.rb +27 -0
  96. data/lib/cxml/subtotal_amount.rb +9 -0
  97. data/lib/cxml/supplier_setup.rb +13 -0
  98. data/lib/cxml/tax.rb +42 -0
  99. data/lib/cxml/tax_adjustment_amount.rb +9 -0
  100. data/lib/cxml/tax_amount.rb +9 -0
  101. data/lib/cxml/tax_detail.rb +44 -0
  102. data/lib/cxml/tax_location.rb +9 -0
  103. data/lib/cxml/taxable_amount.rb +9 -0
  104. data/lib/cxml/to.rb +9 -0
  105. data/lib/cxml/total.rb +10 -0
  106. data/lib/cxml/total_allowances.rb +9 -0
  107. data/lib/cxml/total_amount_without_tax.rb +9 -0
  108. data/lib/cxml/total_charges.rb +9 -0
  109. data/lib/cxml/unit_price.rb +9 -0
  110. data/lib/cxml/version.rb +5 -0
  111. data/lib/cxml.rb +39 -0
  112. data/spec/credential_spec.rb +37 -0
  113. data/spec/cxml_spec.rb +6 -0
  114. data/spec/document_spec.rb +155 -0
  115. data/spec/fixtures/.gitkeep +0 -0
  116. data/spec/fixtures/envelope.xml +31 -0
  117. data/spec/fixtures/envelope2.xml +36 -0
  118. data/spec/fixtures/invoice_backed_and_unbacked_by_pos.xml +106 -0
  119. data/spec/fixtures/invoice_backed_by_multiple_pos.xml +97 -0
  120. data/spec/fixtures/invoice_taxes_at_line.xml +82 -0
  121. data/spec/fixtures/invoice_taxes_at_line_multiple_taxes.xml +403 -0
  122. data/spec/fixtures/invoice_taxes_at_total.xml +78 -0
  123. data/spec/fixtures/item_in.xml +11 -0
  124. data/spec/fixtures/order_request.cxml +121 -0
  125. data/spec/fixtures/punch_out_order_message_doc.xml +32 -0
  126. data/spec/fixtures/punch_out_setup_request_doc.xml +32 -0
  127. data/spec/fixtures/punch_out_setup_request_doc_coupa.xml +42 -0
  128. data/spec/fixtures/punch_out_setup_request_doc_with_ship_to.xml +46 -0
  129. data/spec/fixtures/purchase_order_request_200.xml +132 -0
  130. data/spec/fixtures/request_doc.xml +79 -0
  131. data/spec/fixtures/response_status_200.xml +11 -0
  132. data/spec/fixtures/response_status_400.xml +5 -0
  133. data/spec/header_spec.rb +54 -0
  134. data/spec/invoice_detail_request_spec.rb +88 -0
  135. data/spec/item_detail_spec.rb +44 -0
  136. data/spec/item_id_spec.rb +40 -0
  137. data/spec/item_in_spec.rb +41 -0
  138. data/spec/money_spec.rb +44 -0
  139. data/spec/parser_spec.rb +6 -0
  140. data/spec/protocol_spec.rb +16 -0
  141. data/spec/punch_out_order_message_header_spec.rb +36 -0
  142. data/spec/punch_out_order_message_spec.rb +43 -0
  143. data/spec/punch_out_setup_request_spec.rb +60 -0
  144. data/spec/purchase_order_request_spec.rb +40 -0
  145. data/spec/request_spec.rb +36 -0
  146. data/spec/response_spec.rb +58 -0
  147. data/spec/sender_spec.rb +32 -0
  148. data/spec/spec_helper.rb +21 -0
  149. data/spec/status_spec.rb +44 -0
  150. data/spec/support/helpers.rb +5 -0
  151. metadata +317 -0
@@ -0,0 +1,42 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">
3
+ <cXML payloadID="1211221788.71299@ip-10-251-122-83" timestamp="Mon May 19 18:29:48 +0000 2008" xml:lang="en-US">
4
+ <Header>
5
+ <From>
6
+ <Credential domain="DUNS">
7
+ <Identity>coupa-t</Identity>
8
+ </Credential>
9
+ </From>
10
+ <To>
11
+ <Credential domain="DUNS">
12
+ <Identity>coupa-t</Identity>
13
+ </Credential>
14
+ </To>
15
+ <Sender>
16
+ <Credential domain="DUNS">
17
+ <Identity>coupa-t</Identity>
18
+ <SharedSecret>test</SharedSecret>
19
+ </Credential>
20
+ <UserAgent>Coupa Procurement 1.0</UserAgent>
21
+ </Sender>
22
+ </Header>
23
+ <Request>
24
+ <PunchOutSetupRequest operation="create">
25
+ <BuyerCookie>c64af92dc27e68172e030d3dfd1bc944</BuyerCookie>
26
+ <Extrinsic name="FirstName">Jim</Extrinsic>
27
+ <Extrinsic name="LastName">Halpert</Extrinsic>
28
+ <Extrinsic name="UniqueName">jim</Extrinsic>
29
+ <Extrinsic name="UserEmail">noah+jim@coupa.com</Extrinsic>
30
+ <Extrinsic name="User">jim</Extrinsic>
31
+ <Extrinsic name="BusinessUnit">COUPA</Extrinsic>
32
+ <Contact role="endUser">
33
+ <Name xml:lang="en-US">jim</Name>
34
+ <Email>noah+jim@coupa.com</Email>
35
+ </Contact>
36
+ <BrowserFormPost>
37
+ <URL>https://qa.coupahost.com/punchout/checkout/4</URL>
38
+ </BrowserFormPost>
39
+ </PunchOutSetupRequest>
40
+ </Request>
41
+ </cXML>
42
+
@@ -0,0 +1,46 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <cXML payloadID="demoSCAWIG@IESAonline" xml:lang="en-UK" timestamp="2007-04-30T15:52:54+00:00">
3
+ <Header>
4
+ <From>
5
+ <Credential domain="DUNS">
6
+ <Identity>punchout@test.com</Identity>
7
+ </Credential>
8
+ </From>
9
+ <To>
10
+ <Credential domain="DUNS">
11
+ <Identity>punchout@test.com</Identity>
12
+ </Credential>
13
+ </To>
14
+ <Sender>
15
+ <Credential domain="IESAnetworkUserID"> <Identity>88888888</Identity> <SharedSecret>{shared secret in here}</SharedSecret> </Credential> <UserAgent>IESAonlinevers1</UserAgent>
16
+ </Sender>
17
+ </Header>
18
+ <Request deploymentMode="production">
19
+ <PunchOutSetupRequest operation="create"> <BuyerCookie>demoSCAWIGP</BuyerCookie>
20
+ <BrowserFormPost>
21
+ <URL>
22
+ http://return_to_supplier_url.com
23
+ </URL>
24
+ </BrowserFormPost>
25
+ <SupplierSetup>
26
+ <URL>
27
+ http://localhost:3000
28
+ </URL>
29
+ </SupplierSetup>
30
+ <ShipTo>
31
+ <Address isoCountryCode="US" addressID="3119">
32
+ <Name xml:lang="en">jmadden</Name>
33
+ <PostalAddress name="default">
34
+ <DeliverTo>j maddedn</DeliverTo>
35
+ <Street>333 East Hill Dr</Street>
36
+ <City>san leandro</City>
37
+ <State>ca</State>
38
+ <PostalCode>22222</PostalCode>
39
+ <Country isoCountryCode="US">United States</Country>
40
+ </PostalAddress>
41
+ <Email name="default">jmadden@coupa1.com</Email>
42
+ </Address>
43
+ </ShipTo>
44
+ </PunchOutSetupRequest>
45
+ </Request>
46
+ </cXML>
@@ -0,0 +1,132 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">
3
+ <cXML xml:lang="en-US" payloadID="1452186890.009162@ip-10-7-14-126" timestamp="2008-01-07T09:14:50-08:00">
4
+ <Header>
5
+ <From>
6
+ <Credential domain="duns">
7
+ <!-- Customer domain typically provided by Supplier, typically DUNS -->
8
+ <Identity>dell</Identity>
9
+ <!-- Customer id typically provided by Supplier, string -->
10
+ </Credential>
11
+ </From>
12
+ <To>
13
+ <Credential domain="Duns">
14
+ <!-- Supplier domain typically provided by Supplier, typically DUNS -->
15
+ <Identity>128293714</Identity>
16
+ <!-- Supplier id typically provided by Supplier, string -->
17
+ </Credential>
18
+ </To>
19
+ <Sender>
20
+ <Credential domain="duns">
21
+ <Identity>dell</Identity>
22
+ <!-- same as From -->
23
+ </Credential>
24
+ <UserAgent>Coupa Procurement 1.0</UserAgent>
25
+ <!-- does not change -->
26
+ </Sender>
27
+ </Header>
28
+ <Request deploymentMode="production">
29
+ <OrderRequest>
30
+ <OrderRequestHeader orderID="6112" orderDate="2008-01-07T09:14:50-08:00" type="new">
31
+ <!-- Coupa supports "new" and "update" -->
32
+ <Total>
33
+ <Money currency="USD">1505.0</Money>
34
+ <!-- Currency code configured in Coupa -->
35
+ </Total>
36
+ <ShipTo>
37
+ <Address isoCountryCode="US" addressID="3119">
38
+ <Name xml:lang="en">jmadden</Name>
39
+ <PostalAddress name="default">
40
+ <DeliverTo>j maddedn</DeliverTo>
41
+ <Street>333 East Hill Dr</Street>
42
+ <City>san leandro</City>
43
+ <State>ca</State>
44
+ <PostalCode>22222</PostalCode>
45
+ <Country isoCountryCode="US">United States</Country>
46
+ </PostalAddress>
47
+ <Email name="default">jmadden@coupa1.com</Email>
48
+ </Address>
49
+ </ShipTo>
50
+ <BillTo>
51
+ <Address isoCountryCode="US" addressID="142">
52
+ <Name xml:lang="en">SOB1</Name>
53
+ <!-- Company Name under Company Information in Coupa -->
54
+ <PostalAddress name="default">
55
+ <DeliverTo>Noah Sanity Attn: Noah Noah</DeliverTo>
56
+ <Street>3420 Flatiron Way</Street>
57
+ <City>West Index</City>
58
+ <State>NJ</State>
59
+ <PostalCode>43023</PostalCode>
60
+ <Country isoCountryCode="US">United States</Country>
61
+ </PostalAddress>
62
+ </Address>
63
+ </BillTo>
64
+ <Contact role="endUser">
65
+ <Name xml:lang="en">j maddedn</Name>
66
+ <Email name="default">jmadden@coupa1.com</Email>
67
+ </Contact>
68
+ <Comments xml:lang="en">header comment goes here if entered by user</Comments>
69
+ </OrderRequestHeader>
70
+ <ItemOut quantity="1" lineNumber="1">
71
+ <ItemID>
72
+ <SupplierPartID>223-4511</SupplierPartID>
73
+ <!-- Coupa Item Part Number -->
74
+ <SupplierPartAuxiliaryID>1005379527029\1</SupplierPartAuxiliaryID>
75
+ <!-- Auxiliary Part Number is optional, typically used by punchout suppliers -->
76
+ </ItemID>
77
+ <ItemDetail>
78
+ <UnitPrice>
79
+ <Money currency="USD">1505.0</Money>
80
+ <!-- Currency code configured in Coupa -->
81
+ </UnitPrice>
82
+ <Description xml:lang="en">OptiPlex 755 Energy Smart Minitower;IntelREG CoreTM 2 Quad Processor Q6600 (2.40GHz, 2X4M, 1066MHz FSB)</Description>
83
+ <UnitOfMeasure>EA</UnitOfMeasure>
84
+ <Classification domain="UNSPSC">44000000</Classification>
85
+ <!-- Future expansion -->
86
+ </ItemDetail>
87
+ <Distribution>
88
+ <Accounting name="bbbb">
89
+ <!-- Coupa Account name -->
90
+ <Segment id="bbb" description="ORG" type="Organization" />
91
+ <Segment id="b" description="DEPT" type="Department" />
92
+ <Segment id="bb" description="PROJ" type="Project" />
93
+ </Accounting>
94
+ <Charge>
95
+ <Money currency="USD">1505.0</Money>
96
+ </Charge>
97
+ </Distribution>
98
+ <Comments xml:lang="en">line item comment goes here if entered by user</Comments>
99
+ </ItemOut>
100
+ <ItemOut quantity="2" lineNumber="2">
101
+ <ItemID>
102
+ <SupplierPartID>223-4511</SupplierPartID>
103
+ <!-- Coupa Item Part Number -->
104
+ <SupplierPartAuxiliaryID>1005379527029\1</SupplierPartAuxiliaryID>
105
+ <!-- Auxiliary Part Number is optional, typically used by punchout suppliers -->
106
+ </ItemID>
107
+ <ItemDetail>
108
+ <UnitPrice>
109
+ <Money currency="USD">1505.0</Money>
110
+ <!-- Currency code configured in Coupa -->
111
+ </UnitPrice>
112
+ <Description xml:lang="en">OptiPlex 755 Energy Smart Minitower;IntelREG CoreTM 2 Quad Processor Q6600 (2.40GHz, 2X4M, 1066MHz FSB)</Description>
113
+ <UnitOfMeasure>EA</UnitOfMeasure>
114
+ <Classification domain="UNSPSC">44000000</Classification>
115
+ <!-- Future expansion -->
116
+ </ItemDetail>
117
+ <Distribution>
118
+ <Accounting name="bbbb">
119
+ <!-- Coupa Account name -->
120
+ <Segment id="bbb" description="ORG" type="Organization" />
121
+ <Segment id="b" description="DEPT" type="Department" />
122
+ <Segment id="bb" description="PROJ" type="Project" />
123
+ </Accounting>
124
+ <Charge>
125
+ <Money currency="USD">1505.0</Money>
126
+ </Charge>
127
+ </Distribution>
128
+ <Comments xml:lang="en">line item comment goes here if entered by user</Comments>
129
+ </ItemOut>
130
+ </OrderRequest>
131
+ </Request>
132
+ </cXML>
@@ -0,0 +1,79 @@
1
+ <?xml version="1.0"?>
2
+ <cXML version="1.2.011" payloadID="1346769469000.process.162998590@officedepot.com" timestamp="2012-09-04T02:37:49-05:00">
3
+ <Header>
4
+ <From>
5
+ <Credential domain="NetworkID">
6
+ <Identity>AN01000000147</Identity>
7
+ </Credential>
8
+ </From>
9
+ <To>
10
+ <Credential domain="NetworkId">
11
+ <Identity>customerID</Identity>
12
+ </Credential>
13
+ </To>
14
+ <Sender>
15
+ <Credential domain="NetworkID">
16
+ <Identity>AN01000000147</Identity>
17
+ <SharedSecret>welcome</SharedSecret>
18
+ </Credential>
19
+ <UserAgent>BSD 8.12</UserAgent>
20
+ </Sender>
21
+ </Header>
22
+ <Request deploymentMode="production">
23
+ <ConfirmationRequest>
24
+ <ConfirmationHeader confirmID="" operation="new" type="detail" noticeDate="2012-09-04T02:37:49-05:00" invoiceID="623612976001">
25
+ <Contact role="shipTo" addressID="0170-74629-00">
26
+ <Name xml:lang="en-US">HOSPITAL BUILDING</Name>
27
+ <PostalAddress>
28
+ <DeliverTo>Yvonne Smith</DeliverTo>
29
+ <DeliverTo>541813031</DeliverTo>
30
+ <Street>3601 Mile Road</Street>
31
+ <Street>BUILDING: 0170-74629-00</Street>
32
+ <City>Royal Oak</City>
33
+ <State>MI</State>
34
+ <PostalCode>48073</PostalCode>
35
+ <Country isoCountryCode="US">United States</Country>
36
+ </PostalAddress>
37
+ </Contact>
38
+ </ConfirmationHeader>
39
+ <OrderReference orderID="400-2591453-0">
40
+ <DocumentReference payloadID="20120904023747.cXMLPurchaseOrder.984556224@eprosvcs.com"/>
41
+ </OrderReference>
42
+ <ConfirmationItem quantity="20" lineNumber="1">
43
+ <UnitOfMeasure>RM</UnitOfMeasure>
44
+ <ConfirmationStatus quantity="20" type="accept" shipmentDate="2012-09-05T12:00:00-05:00" deliveryDate="2012-09-05T12:00:00-05:00">
45
+ <UnitOfMeasure>RM</UnitOfMeasure>
46
+ <UnitPrice>
47
+ <Money currency="USD">4.44</Money>
48
+ </UnitPrice>
49
+ <Comments></Comments>
50
+ <Extrinsic name="SupplierPartID">751441</Extrinsic>
51
+ <Extrinsic name="SupplierPartAuxilliaryID">751441</Extrinsic>
52
+ </ConfirmationStatus>
53
+ </ConfirmationItem>
54
+ <ConfirmationItem quantity="12" lineNumber="2">
55
+ <UnitOfMeasure>BX</UnitOfMeasure>
56
+ <ConfirmationStatus quantity="12" type="accept" shipmentDate="2012-09-05T12:00:00-05:00" deliveryDate="2012-09-05T12:00:00-05:00">
57
+ <UnitOfMeasure>BX</UnitOfMeasure>
58
+ <UnitPrice>
59
+ <Money currency="USD">1.52</Money>
60
+ </UnitPrice>
61
+ <Comments></Comments>
62
+ <Extrinsic name="SupplierPartID">429175</Extrinsic>
63
+ <Extrinsic name="SupplierPartAuxilliaryID">429175</Extrinsic>
64
+ </ConfirmationStatus>
65
+ </ConfirmationItem>
66
+ <ConfirmationItem quantity="2" lineNumber="3">
67
+ <UnitOfMeasure>EA</UnitOfMeasure>
68
+ <ConfirmationStatus quantity="2" type="accept" shipmentDate="2012-09-05T12:00:00-05:00" deliveryDate="2012-09-05T12:00:00-05:00">
69
+ <UnitOfMeasure>EA</UnitOfMeasure>
70
+ <UnitPrice>
71
+ <Money currency="USD">4.14</Money>
72
+ </UnitPrice>
73
+ <Comments></Comments>
74
+ <Extrinsic name="SupplierPartID">908194</Extrinsic>
75
+ </ConfirmationStatus>
76
+ </ConfirmationItem>
77
+ </ConfirmationRequest>
78
+ </Request>
79
+ </cXML>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <cXML version="1.2.011" payloadID="1346769469000.process.162998590@officedepot.com" timestamp="2012-09-04T02:37:49-05:00">
3
+ <Response>
4
+ <Status code="200" text="OK"/>
5
+ <PunchOutSetupResponse>
6
+ <StartPage>
7
+ <URL>http://localhost:3000/products</URL>
8
+ </StartPage>
9
+ </PunchOutSetupResponse>
10
+ </Response>
11
+ </cXML>
@@ -0,0 +1,5 @@
1
+ <cXML version="1.2.011" payloadID="1352382581000.process.454701738@domain.com" timestamp="2012-11-08T01:49:41-05:00">
2
+ <Response>
3
+ <Status code="400" text="java.lang.Exception: missing required parameter 'document'"/>
4
+ </Response>
5
+ </cXML>
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::Header do
6
+ shared_examples_for :render_defaults do
7
+ it 'returns xml content' do
8
+ output_xml.should_not be_nil
9
+ end
10
+
11
+ it 'returns xml content with with required xml nodes' do
12
+ header_output_data[:to].should_not be_empty
13
+ header_output_data[:from].should_not be_empty
14
+ header_output_data[:sender].should_not be_empty
15
+ end
16
+ end
17
+
18
+ it { should respond_to :from }
19
+ it { should respond_to :to }
20
+ it { should respond_to :sender }
21
+ it { should respond_to :render }
22
+
23
+ let(:parser) { CXML::Parser.new }
24
+ let(:doc) { CXML::Document.new(data) }
25
+ let(:builder) { doc.render }
26
+ let(:header) { doc.header }
27
+ let(:data) { parser.parse(fixture('request_doc.xml')) }
28
+
29
+ describe '#initialize' do
30
+ it 'sets the mandatory attributes' do
31
+ header.to.should be_instance_of(CXML::To)
32
+ header.from.should be_instance_of(CXML::From)
33
+ header.sender.should be_instance_of(CXML::Sender)
34
+ end
35
+ end
36
+
37
+ describe '#render' do
38
+ let(:output_xml) { builder.to_xml }
39
+ let(:output_data) { parser.parse(output_xml) }
40
+ let(:header_output_data) { output_data[:header] }
41
+ let(:from_identity) { header_output_data[:from][:credential][:identity] }
42
+ let(:to_identity) { header_output_data[:to][:credential][:identity] }
43
+
44
+ include_examples :render_defaults
45
+
46
+ context 'when the header is rendered as not a response' do
47
+ let(:data) { parser.parse(fixture('request_doc.xml')) }
48
+ it 'will NOT swap the to and from attributes' do
49
+ from_identity.should eq(header.from.credential.identity)
50
+ to_identity.should eq(header.to.credential.identity)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::InvoiceDetailRequest do
6
+ it { should respond_to :invoice_detail_request_header }
7
+ it { should respond_to :invoice_detail_orders }
8
+ it { should respond_to :invoice_detail_header_orders }
9
+ it { should respond_to :invoice_detail_summary }
10
+
11
+ describe '#initialize' do
12
+ it 'sets invoice_detail_request_header' do
13
+ data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line.xml'))
14
+ doc = CXML::Document.new(data)
15
+ instance = doc.request.invoice_detail_request
16
+ instance.invoice_detail_request_header
17
+ .should be_an_instance_of CXML::InvoiceDetailRequestHeader
18
+ end
19
+ it 'sets invoice_detail_request_header' do
20
+ data = CXML::Parser.new.parse(fixture('invoice_taxes_at_total.xml'))
21
+ doc = CXML::Document.new(data)
22
+ instance = doc.request.invoice_detail_request
23
+ instance.invoice_detail_request_header
24
+ .should be_an_instance_of CXML::InvoiceDetailRequestHeader
25
+ end
26
+ it 'sets invoice_detail_request_header' do
27
+ data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line_multiple_taxes.xml'))
28
+ doc = CXML::Document.new(data)
29
+ instance = doc.request.invoice_detail_request
30
+ instance.invoice_detail_request_header
31
+ .should be_an_instance_of CXML::InvoiceDetailRequestHeader
32
+ end
33
+ it 'sets invoice_detail_request_header' do
34
+ data = CXML::Parser.new.parse(fixture('invoice_backed_and_unbacked_by_pos.xml'))
35
+ doc = CXML::Document.new(data)
36
+ instance = doc.request.invoice_detail_request
37
+ instance.invoice_detail_request_header
38
+ .should be_an_instance_of CXML::InvoiceDetailRequestHeader
39
+ end
40
+ it 'sets invoice_detail_request_header' do
41
+ data = CXML::Parser.new.parse(fixture('invoice_backed_by_multiple_pos.xml'))
42
+ doc = CXML::Document.new(data)
43
+ instance = doc.request.invoice_detail_request
44
+ instance.invoice_detail_request_header
45
+ .should be_an_instance_of CXML::InvoiceDetailRequestHeader
46
+ end
47
+ end
48
+ describe '#to_xml' do
49
+ it 'serializes the same output' do
50
+ data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line.xml'))
51
+ doc = CXML::Document.new(data)
52
+ CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
53
+ end
54
+ it 'serializes the same output' do
55
+ data = CXML::Parser.new.parse(fixture('invoice_backed_and_unbacked_by_pos.xml'))
56
+ doc = CXML::Document.new(data)
57
+ CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
58
+ end
59
+ it 'serializes the same output' do
60
+ data = CXML::Parser.new.parse(fixture('invoice_backed_by_multiple_pos.xml'))
61
+ doc = CXML::Document.new(data)
62
+ CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
63
+ end
64
+ it 'serializes the same output' do
65
+ data = CXML::Parser.new.parse(fixture('invoice_taxes_at_line_multiple_taxes.xml'))
66
+ doc = CXML::Document.new(data)
67
+ CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
68
+ end
69
+ it 'serializes the same output' do
70
+ fixture_xml = fixture('invoice_taxes_at_total.xml')
71
+ data = CXML::Parser.new.parse(fixture_xml)
72
+ doc = CXML::Document.new(data)
73
+ CXML::Parser.new.parse(doc.render.to_xml).should eq(data)
74
+ end
75
+ it 'serializes from an instance' do
76
+ money = CXML::Money.new(amount: '5', currency: 'USD')
77
+ summary = CXML::InvoiceDetailSummary.new(gross_amount: CXML::GrossAmount.new(money: money))
78
+ instance = described_class.new(invoice_detail_summary: summary)
79
+ data = CXML::Request.new(invoice_detail_request: instance)
80
+ doc = CXML::Document.new(request: data)
81
+ parsed = CXML::Parser.new.parse(doc.render.to_xml)
82
+ parsed[:request][:invoice_detail_request]
83
+ .should eq(instance.serializable_hash)
84
+ parsed[:request][:invoice_detail_request][:invoice_detail_summary][:gross_amount][:money]
85
+ .should eq({ content: '5', currency: 'USD' })
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::ItemDetail do
6
+ it { should respond_to :description }
7
+ it { should respond_to :unit_of_measure }
8
+ it { should respond_to :unit_price }
9
+
10
+ let(:parser) { CXML::Parser.new }
11
+ let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
12
+ let(:doc) { CXML::Document.new(data) }
13
+ let(:punch_out_order_message) { doc.message.punch_out_order_message }
14
+ let(:builder) { doc.render }
15
+
16
+ describe '#initialize' do
17
+ let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
18
+ let(:item_detail) { item_in.item_detail }
19
+
20
+ it 'sets the mandatory attributes' do
21
+ item_detail.unit_of_measure.should_not be_nil
22
+ item_detail.description.should_not be_nil
23
+ item_detail.unit_price.should_not be_nil
24
+ end
25
+ end
26
+
27
+ describe '#render' do
28
+ before(:each) do
29
+ punch_out_order_message.add_item(build_item_in(parser))
30
+ end
31
+
32
+ let(:output_xml) { builder.to_xml }
33
+ let(:output_data) { parser.parse(output_xml) }
34
+ let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
35
+ let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
36
+ let(:item_detail_output_data) { item_in_output_data[:item_detail] }
37
+
38
+ it 'contains the required nodes' do
39
+ item_detail_output_data[:unit_of_measure].should_not be_empty
40
+ item_detail_output_data[:unit_price].should_not be_empty
41
+ item_detail_output_data[:description].should_not be_empty
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::ItemID do
6
+ it { should respond_to :supplier_part_id }
7
+ it { should respond_to :supplier_part_auxiliary_id }
8
+
9
+ let(:parser) { CXML::Parser.new }
10
+ let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
11
+ let(:doc) { CXML::Document.new(data) }
12
+ let(:punch_out_order_message) { doc.message.punch_out_order_message }
13
+ let(:builder) { doc.render }
14
+
15
+ describe '#initialize' do
16
+ let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
17
+ let(:item_id) { item_in.item_id }
18
+
19
+ it 'sets the attributes that are passed' do
20
+ item_id.supplier_part_id.should_not be_nil
21
+ end
22
+ end
23
+
24
+ describe '#render' do
25
+ before(:each) do
26
+ punch_out_order_message.add_item(build_item_in(parser))
27
+ end
28
+
29
+ let(:output_xml) { builder.to_xml }
30
+ let(:output_data) { parser.parse(output_xml) }
31
+ let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
32
+ let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
33
+ let(:item_id_output_data) { item_in_output_data[:item_id] }
34
+
35
+ it 'contains the required nodes' do
36
+ item_id_output_data[:supplier_part_id].should_not be_empty
37
+ item_id_output_data.should include(:supplier_part_auxiliary_id)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::ItemIn do
6
+ it { should respond_to :item_id }
7
+ it { should respond_to :item_detail }
8
+ it { should respond_to :line_number }
9
+ it { should respond_to :quantity }
10
+
11
+ let(:parser) { CXML::Parser.new }
12
+ let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
13
+ let(:doc) { CXML::Document.new(data) }
14
+ let(:punch_out_order_message) { doc.message.punch_out_order_message }
15
+ let(:builder) { doc.render }
16
+
17
+ describe '#initialize' do
18
+ let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
19
+
20
+ it 'sets the mandatory attributes' do
21
+ item_in.quantity.should_not be_nil
22
+ end
23
+ end
24
+
25
+ describe '#render' do
26
+ before(:each) do
27
+ punch_out_order_message.add_item(build_item_in(parser))
28
+ end
29
+
30
+ let(:output_xml) { builder.to_xml }
31
+ let(:output_data) { parser.parse(output_xml) }
32
+ let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
33
+ let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
34
+
35
+ it 'contains the required nodes' do
36
+ item_in_output_data[:quantity].should_not be_empty
37
+ item_in_output_data[:item_id].should_not be_empty
38
+ item_in_output_data[:item_detail].should_not be_empty
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::Money do
6
+ it { should respond_to :currency }
7
+ it { should respond_to :alternate_currency }
8
+ it { should respond_to :alternate_amount }
9
+ it { should respond_to :amount }
10
+
11
+ let(:parser) { CXML::Parser.new }
12
+ let(:data) { parser.parse(fixture('punch_out_order_message_doc.xml')) }
13
+ let(:doc) { CXML::Document.new(data) }
14
+ let(:punch_out_order_message) { doc.message.punch_out_order_message }
15
+ let(:builder) { doc.render }
16
+ let(:item_in) { CXML::ItemIn.new(build_item_in(parser)) }
17
+ let(:item_detail) { item_in.item_detail }
18
+ let(:money) { item_detail.unit_price.money }
19
+
20
+ describe '#initialize' do
21
+ it 'sets the attributes that are passed' do
22
+ money.currency.should_not be_nil
23
+ money.amount.should_not be_nil
24
+ end
25
+ end
26
+
27
+ describe '#render' do
28
+ before(:each) do
29
+ punch_out_order_message.add_item(build_item_in(parser))
30
+ end
31
+
32
+ let(:output_xml) { builder.to_xml }
33
+ let(:output_data) { parser.parse(output_xml) }
34
+ let(:punch_out_order_message_output_data) { output_data[:message][:punch_out_order_message] }
35
+ let(:item_in_output_data) { punch_out_order_message_output_data[:item_in] }
36
+ let(:item_detail_output_data) { item_in_output_data[:item_detail] }
37
+ let(:unit_price_output_data) { item_detail_output_data[:unit_price] }
38
+ let(:money_output_data) { unit_price_output_data[:money] }
39
+
40
+ it 'contains the required nodes' do
41
+ money_output_data[:currency].should_not be_empty
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::Parser do
6
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CXML::Protocol do
6
+ it { should respond_to :version }
7
+ it { should respond_to :request_elements }
8
+ it { should respond_to :response_elements }
9
+ it { should respond_to :status_codes }
10
+
11
+ context '#version' do
12
+ it 'returns current protocol version' do
13
+ subject.version.should eq('1.2.011')
14
+ end
15
+ end
16
+ end