fortnox-api 0.1.0 → 0.2.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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +3 -2
  3. data/.env.test +3 -0
  4. data/.rubocop.yml +32 -23
  5. data/.travis.yml +3 -2
  6. data/Guardfile +2 -2
  7. data/LICENSE.txt +165 -22
  8. data/README.md +56 -37
  9. data/fortnox-api.gemspec +9 -6
  10. data/lib/fortnox/api.rb +18 -2
  11. data/lib/fortnox/api/base.rb +5 -3
  12. data/lib/fortnox/api/environment_validation.rb +51 -6
  13. data/lib/fortnox/api/mappers.rb +49 -0
  14. data/lib/fortnox/api/mappers/base.rb +47 -0
  15. data/lib/fortnox/api/mappers/base/from_json.rb +78 -0
  16. data/lib/fortnox/api/mappers/base/to_json.rb +65 -0
  17. data/lib/fortnox/api/mappers/customer.rb +27 -0
  18. data/lib/fortnox/api/mappers/default_delivery_types.rb +13 -0
  19. data/lib/fortnox/api/mappers/default_templates.rb +15 -0
  20. data/lib/fortnox/api/mappers/edi_information.rb +22 -0
  21. data/lib/fortnox/api/mappers/email_information.rb +18 -0
  22. data/lib/fortnox/api/mappers/invoice.rb +27 -0
  23. data/lib/fortnox/api/mappers/invoice_row.rb +20 -0
  24. data/lib/fortnox/api/mappers/order.rb +23 -0
  25. data/lib/fortnox/api/mappers/order_row.rb +16 -0
  26. data/lib/fortnox/api/models.rb +2 -0
  27. data/lib/fortnox/api/models/base.rb +56 -13
  28. data/lib/fortnox/api/models/customer.rb +112 -101
  29. data/lib/fortnox/api/models/document_base.rb +189 -0
  30. data/lib/fortnox/api/models/invoice.rb +29 -195
  31. data/lib/fortnox/api/models/label.rb +17 -0
  32. data/lib/fortnox/api/models/order.rb +27 -0
  33. data/lib/fortnox/api/repositories.rb +2 -0
  34. data/lib/fortnox/api/repositories/base.rb +4 -5
  35. data/lib/fortnox/api/repositories/base/loaders.rb +22 -14
  36. data/lib/fortnox/api/repositories/base/savers.rb +30 -16
  37. data/lib/fortnox/api/repositories/customer.rb +3 -25
  38. data/lib/fortnox/api/repositories/invoice.rb +3 -22
  39. data/lib/fortnox/api/repositories/order.rb +16 -0
  40. data/lib/fortnox/api/request_handling.rb +3 -3
  41. data/lib/fortnox/api/types.rb +44 -0
  42. data/lib/fortnox/api/types/default_delivery_types.rb +20 -0
  43. data/lib/fortnox/api/types/default_templates.rb +23 -0
  44. data/lib/fortnox/api/types/defaulted.rb +11 -0
  45. data/lib/fortnox/api/types/document_row.rb +65 -0
  46. data/lib/fortnox/api/types/edi_information.rb +29 -0
  47. data/lib/fortnox/api/types/email_information.rb +26 -0
  48. data/lib/fortnox/api/types/enums.rb +75 -0
  49. data/lib/fortnox/api/types/invoice_row.rb +19 -0
  50. data/lib/fortnox/api/types/model.rb +40 -0
  51. data/lib/fortnox/api/types/nullable.rb +21 -0
  52. data/lib/fortnox/api/types/order_row.rb +16 -0
  53. data/lib/fortnox/api/types/required.rb +13 -0
  54. data/lib/fortnox/api/types/sized.rb +25 -0
  55. data/lib/fortnox/api/version.rb +1 -1
  56. data/spec/fortnox/api/base_spec.rb +85 -14
  57. data/spec/fortnox/api/mappers/base/from_json_spec.rb +70 -0
  58. data/spec/fortnox/api/mappers/base/to_json_spec.rb +76 -0
  59. data/spec/fortnox/api/mappers/base_spec.rb +156 -0
  60. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +56 -0
  61. data/spec/fortnox/api/mappers/customer_spec.rb +25 -0
  62. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +12 -0
  63. data/spec/fortnox/api/mappers/edi_information_spec.rb +21 -0
  64. data/spec/fortnox/api/mappers/email_information_spec.rb +17 -0
  65. data/spec/fortnox/api/mappers/examples/mapper.rb +26 -0
  66. data/spec/fortnox/api/mappers/invoice_row_spec.rb +19 -0
  67. data/spec/fortnox/api/mappers/invoice_spec.rb +24 -0
  68. data/spec/fortnox/api/mappers/order_row_spec.rb +14 -0
  69. data/spec/fortnox/api/mappers/order_spec.rb +20 -0
  70. data/spec/fortnox/api/models/base_spec.rb +44 -22
  71. data/spec/fortnox/api/models/customer_spec.rb +9 -0
  72. data/spec/fortnox/api/models/examples/document_base.rb +13 -0
  73. data/spec/fortnox/api/models/examples/model.rb +13 -0
  74. data/spec/fortnox/api/models/invoice_spec.rb +7 -31
  75. data/spec/fortnox/api/models/order_spec.rb +13 -0
  76. data/spec/fortnox/api/repositories/customer_spec.rb +20 -76
  77. data/spec/fortnox/api/repositories/examples/all.rb +17 -0
  78. data/spec/fortnox/api/repositories/examples/find.rb +25 -0
  79. data/spec/fortnox/api/repositories/examples/only.rb +42 -0
  80. data/spec/fortnox/api/repositories/examples/save.rb +69 -0
  81. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +32 -0
  82. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +27 -0
  83. data/spec/fortnox/api/repositories/examples/search.rb +31 -0
  84. data/spec/fortnox/api/repositories/invoice_spec.rb +36 -5
  85. data/spec/fortnox/api/repositories/order_spec.rb +35 -0
  86. data/spec/fortnox/api/types/account_number_spec.rb +28 -0
  87. data/spec/fortnox/api/types/default_delivery_types_spec.rb +10 -0
  88. data/spec/fortnox/api/types/edi_information_spec.rb +13 -0
  89. data/spec/fortnox/api/types/email_information_spec.rb +13 -0
  90. data/spec/fortnox/api/types/email_spec.rb +29 -0
  91. data/spec/fortnox/api/types/enums_spec.rb +13 -0
  92. data/spec/fortnox/api/types/examples/document_row.rb +15 -0
  93. data/spec/fortnox/api/types/examples/enum.rb +48 -0
  94. data/spec/fortnox/api/types/examples/types.rb +9 -0
  95. data/spec/fortnox/api/types/house_work_types_spec.rb +60 -0
  96. data/spec/fortnox/api/types/invoice_row_spec.rb +9 -0
  97. data/spec/fortnox/api/types/model_spec.rb +56 -0
  98. data/spec/fortnox/api/types/nullable_spec.rb +57 -0
  99. data/spec/fortnox/api/types/order_row_spec.rb +13 -0
  100. data/spec/fortnox/api/types/required_spec.rb +42 -0
  101. data/spec/fortnox/api/types/sized_spec.rb +74 -0
  102. data/spec/fortnox/api_spec.rb +16 -15
  103. data/spec/spec_helper.rb +19 -9
  104. data/spec/support/helpers/dummy_class_helper.rb +19 -0
  105. data/spec/support/helpers/environment_helper.rb +7 -0
  106. data/spec/support/helpers/repository_helper.rb +8 -0
  107. data/spec/support/helpers/when_performing_helper.rb +5 -0
  108. data/spec/support/matchers.rb +1 -1
  109. data/spec/support/matchers/type.rb +17 -0
  110. data/spec/support/matchers/type/attribute_matcher.rb +39 -0
  111. data/spec/support/matchers/type/enum_matcher.rb +21 -0
  112. data/spec/support/matchers/type/have_account_number_matcher.rb +21 -0
  113. data/spec/support/matchers/type/have_country_code_matcher.rb +13 -0
  114. data/spec/support/matchers/type/have_currency_matcher.rb +7 -0
  115. data/spec/support/matchers/type/have_customer_type_matcher.rb +13 -0
  116. data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +7 -0
  117. data/spec/support/matchers/type/have_discount_type_matcher.rb +7 -0
  118. data/spec/support/matchers/type/have_email_matcher.rb +22 -0
  119. data/spec/support/matchers/type/have_house_work_type_matcher.rb +7 -0
  120. data/spec/support/matchers/type/have_nullable_date_matcher.rb +58 -0
  121. data/spec/support/matchers/type/have_nullable_matcher.rb +52 -0
  122. data/spec/support/matchers/type/have_nullable_string_matcher.rb +49 -0
  123. data/spec/support/matchers/type/have_sized_float_matcher.rb +8 -0
  124. data/spec/support/matchers/type/have_sized_integer_matcher.rb +8 -0
  125. data/spec/support/matchers/type/have_sized_string_matcher.rb +35 -0
  126. data/spec/support/matchers/type/have_vat_type_matcher.rb +7 -0
  127. data/spec/support/matchers/type/numeric_matcher.rb +50 -0
  128. data/spec/support/matchers/type/require_attribute_matcher.rb +69 -0
  129. data/spec/support/matchers/type/type_matcher.rb +38 -0
  130. data/spec/vcr_cassettes/customers/all.yml +119 -9
  131. data/spec/vcr_cassettes/customers/find_id_1.yml +8 -9
  132. data/spec/vcr_cassettes/customers/find_new.yml +46 -0
  133. data/spec/vcr_cassettes/customers/save_new.yml +9 -11
  134. data/spec/vcr_cassettes/customers/save_old.yml +9 -12
  135. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +45 -0
  136. data/spec/vcr_cassettes/customers/search_by_name.yml +66 -0
  137. data/spec/vcr_cassettes/customers/search_miss.yml +45 -0
  138. data/spec/vcr_cassettes/invoices/all.yml +104 -0
  139. data/spec/vcr_cassettes/invoices/filter_hit.yml +46 -0
  140. data/spec/vcr_cassettes/invoices/filter_invalid.yml +42 -0
  141. data/spec/vcr_cassettes/invoices/find_id_1.yml +47 -0
  142. data/spec/vcr_cassettes/invoices/find_new.yml +49 -0
  143. data/spec/vcr_cassettes/invoices/save_new.yml +48 -0
  144. data/spec/vcr_cassettes/invoices/save_old.yml +49 -0
  145. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +47 -0
  146. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +47 -0
  147. data/spec/vcr_cassettes/invoices/search_by_name.yml +48 -0
  148. data/spec/vcr_cassettes/invoices/search_miss.yml +45 -0
  149. data/spec/vcr_cassettes/orders/all.yml +144 -0
  150. data/spec/vcr_cassettes/orders/filter_hit.yml +48 -0
  151. data/spec/vcr_cassettes/orders/filter_invalid.yml +42 -0
  152. data/spec/vcr_cassettes/orders/find_id_1.yml +48 -0
  153. data/spec/vcr_cassettes/orders/find_new.yml +49 -0
  154. data/spec/vcr_cassettes/orders/house_work_type_babysitting.yml +47 -0
  155. data/spec/vcr_cassettes/orders/house_work_type_cleaning.yml +47 -0
  156. data/spec/vcr_cassettes/orders/house_work_type_construction.yml +47 -0
  157. data/spec/vcr_cassettes/orders/house_work_type_cooking.yml +43 -0
  158. data/spec/vcr_cassettes/orders/house_work_type_electricity.yml +47 -0
  159. data/spec/vcr_cassettes/orders/house_work_type_gardening.yml +47 -0
  160. data/spec/vcr_cassettes/orders/house_work_type_glassmetalwork.yml +47 -0
  161. data/spec/vcr_cassettes/orders/house_work_type_grounddrainagework.yml +47 -0
  162. data/spec/vcr_cassettes/orders/house_work_type_hvac.yml +47 -0
  163. data/spec/vcr_cassettes/orders/house_work_type_masonry.yml +47 -0
  164. data/spec/vcr_cassettes/orders/house_work_type_othercare.yml +47 -0
  165. data/spec/vcr_cassettes/orders/house_work_type_othercosts.yml +47 -0
  166. data/spec/vcr_cassettes/orders/house_work_type_paintingwallpapering.yml +47 -0
  167. data/spec/vcr_cassettes/orders/house_work_type_snowplowing.yml +47 -0
  168. data/spec/vcr_cassettes/orders/house_work_type_textileclothing.yml +47 -0
  169. data/spec/vcr_cassettes/orders/house_work_type_tutoring.yml +43 -0
  170. data/spec/vcr_cassettes/orders/save_new.yml +48 -0
  171. data/spec/vcr_cassettes/orders/save_old.yml +49 -0
  172. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +47 -0
  173. data/spec/vcr_cassettes/orders/search_by_name.yml +47 -0
  174. data/spec/vcr_cassettes/orders/search_miss.yml +45 -0
  175. metadata +301 -71
  176. data/lib/fortnox/api/models/attributes/country_code.rb +0 -17
  177. data/lib/fortnox/api/models/attributes/currency.rb +0 -17
  178. data/lib/fortnox/api/models/edi_information.rb +0 -28
  179. data/lib/fortnox/api/models/email_information.rb +0 -25
  180. data/lib/fortnox/api/models/row.rb +0 -82
  181. data/lib/fortnox/api/repositories/base/json_convertion.rb +0 -68
  182. data/lib/fortnox/api/repositories/base/options.rb +0 -33
  183. data/lib/fortnox/api/validators.rb +0 -1
  184. data/lib/fortnox/api/validators/attributes/country_code.rb +0 -42
  185. data/lib/fortnox/api/validators/attributes/currency.rb +0 -38
  186. data/lib/fortnox/api/validators/base.rb +0 -70
  187. data/lib/fortnox/api/validators/constant.rb +0 -21
  188. data/lib/fortnox/api/validators/customer.rb +0 -29
  189. data/lib/fortnox/api/validators/edi_information.rb +0 -11
  190. data/lib/fortnox/api/validators/email_information.rb +0 -19
  191. data/lib/fortnox/api/validators/invoice.rb +0 -33
  192. data/lib/fortnox/api/validators/row.rb +0 -22
  193. data/spec/fortnox/api/models/attributes/country_code_spec.rb +0 -23
  194. data/spec/fortnox/api/models/attributes/currency_spec.rb +0 -23
  195. data/spec/fortnox/api/models/attributes/dummy_model_context.rb +0 -9
  196. data/spec/fortnox/api/models/row_spec.rb +0 -13
  197. data/spec/fortnox/api/repositories/context.rb +0 -10
  198. data/spec/fortnox/api/repositories/examples.rb +0 -16
  199. data/spec/fortnox/api/validators/attributes/country_code_spec.rb +0 -9
  200. data/spec/fortnox/api/validators/attributes/currency_spec.rb +0 -9
  201. data/spec/fortnox/api/validators/attributes/examples_for_validate.rb +0 -29
  202. data/spec/fortnox/api/validators/base_spec.rb +0 -61
  203. data/spec/fortnox/api/validators/constant_spec.rb +0 -12
  204. data/spec/fortnox/api/validators/context.rb +0 -102
  205. data/spec/fortnox/api/validators/customer_spec.rb +0 -31
  206. data/spec/fortnox/api/validators/edi_information_spec.rb +0 -18
  207. data/spec/fortnox/api/validators/email_information_spec.rb +0 -26
  208. data/spec/fortnox/api/validators/invoice_spec.rb +0 -36
  209. data/spec/fortnox/api/validators/row_spec.rb +0 -27
  210. data/spec/fortnox/api/validators/validator_examples.rb +0 -20
  211. data/spec/support/matchers/models.rb +0 -27
  212. data/spec/support/matchers/validators.rb +0 -36
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api/mappers/base/to_json'
3
+ require 'fortnox/api/mappers/contexts/json_conversion'
4
+
5
+ describe Fortnox::API::Mapper::ToJSON do
6
+ # TODO:
7
+ # Following error is risen sometimes when all specs are run:
8
+ # "NoMethodError: undefined method `call\' for Test::ProductMapper:Class`"
9
+ it 'should be tested when random error is fixed!'
10
+
11
+ describe 'wrapp_entity_json_hash' do
12
+ it 'should be tested'
13
+ end
14
+
15
+ # include_context 'JSON conversion'
16
+
17
+ # before do
18
+ # module Test
19
+ # class BaseMapper
20
+ # include Fortnox::API::Mapper::ToJSON
21
+ # end
22
+ # end
23
+ # end
24
+
25
+ # let( :mapper ){ Test::ProductMapper.new }
26
+
27
+ # describe 'entity_to_hash' do
28
+ # let( :category1 ){ Test::Category.new( name: 'Cars', id: '1' ) }
29
+ # let( :category2 ){ Test::Category.new( name: 'Fast Cars', id: '2' ) }
30
+ # let( :product_designer ){ Test::ProductDesigner.new( name: 'John Najjar', id: '23' ) }
31
+ # let( :product ) do
32
+ # Test::Product.new( url: 'someurl@example.com',
33
+ # name: 'Ford Mustang',
34
+ # vat: 30000.0 ,
35
+ # categories: [category1, category2],
36
+ # designer: product_designer )
37
+ # end
38
+ # let( :keys_to_filter ){ [:url] }
39
+ # let( :returned_hash ){ mapper.entity_to_hash( product, keys_to_filter ) }
40
+ # let( :inner_hash ){ returned_hash['Product'] }
41
+
42
+ # it 'includes JSON entity wrapper' do
43
+ # expect( returned_hash ).to have_key( 'Product' )
44
+ # end
45
+
46
+ # context 'with keys without mapping' do
47
+ # specify 'converts correctly' do
48
+ # expect( inner_hash['Name'] ).to eq( 'Ford Mustang' )
49
+ # end
50
+ # end
51
+
52
+ # context 'with keys to filter' do
53
+ # specify 'filteres out those keys' do
54
+ # expect( inner_hash ).not_to have_key( '@url' )
55
+ # end
56
+ # end
57
+
58
+ # context 'with nested models' do
59
+ # let( :expected_nested_model_hash ) do
60
+ # [{"Name" => "Cars", "ID" => "1"}, {"Name" => "Fast Cars", "ID" => "2"}]
61
+ # end
62
+
63
+ # specify 'are converted correctly' do
64
+ # expect( inner_hash['Categories'] ).to eq( expected_nested_model_hash )
65
+ # end
66
+ # end
67
+
68
+ # context 'with nested model' do
69
+ # let( :expected_nested_model_hash ){ { 'Name' => 'John Najjar', 'ID' => '23' } }
70
+
71
+ # specify 'is converted correctly' do
72
+ # expect( inner_hash['Designer'] ).to eq( expected_nested_model_hash )
73
+ # end
74
+ # end
75
+ # end
76
+ end
@@ -0,0 +1,156 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers'
4
+ require 'fortnox/api/mappers/base'
5
+ require 'fortnox/api/mappers/examples/mapper'
6
+
7
+ describe Fortnox::API::Mapper::Base do
8
+ it_behaves_like 'mapper', nil, nil, nil, check_constants: false
9
+
10
+ shared_examples_for 'simple mapper' do |registry_key, exp_value|
11
+ subject{ mapper.call( value ) }
12
+ let( :mapper ){ Fortnox::API::Registry[ registry_key ] }
13
+ it{ is_expected.to eq( exp_value ) }
14
+ end
15
+
16
+ shared_examples_for 'identity mapper' do |registry_key|
17
+ subject{ mapper.call( value ) }
18
+ let( :mapper ){ Fortnox::API::Registry[ registry_key ] }
19
+ it{ is_expected.to eq( value ) }
20
+ end
21
+
22
+ describe 'string' do
23
+ include_examples 'identity mapper', :string do
24
+ let( :value ){ Fortnox::API::Types::Nullable::String[ 'test' ] }
25
+ end
26
+ end
27
+
28
+ describe 'int' do
29
+ include_examples 'identity mapper', :int do
30
+ let( :value ){ Fortnox::API::Types::Nullable::Integer[ 1337 ] }
31
+ end
32
+ end
33
+
34
+ describe 'float' do
35
+ include_examples 'identity mapper', :float do
36
+ let( :value ){ Fortnox::API::Types::Nullable::Float[ 13.37 ] }
37
+ end
38
+ end
39
+
40
+ describe 'boolean' do
41
+ include_examples 'identity mapper', :boolean do
42
+ let( :value ){ Fortnox::API::Types::Nullable::Boolean[ false ] }
43
+ end
44
+ end
45
+
46
+ describe 'array' do
47
+ include_examples 'identity mapper', :array do
48
+ let( :value ){ [1,3,3,7] }
49
+ end
50
+ end
51
+
52
+ describe 'advanced array' do
53
+ include_examples 'simple mapper', :array, [ "2016-01-01", "2016-01-02" ] do
54
+ let( :value ){ [ Date.new(2016, 1, 1), Date.new(2016, 1, 2) ] }
55
+ end
56
+ end
57
+
58
+ describe 'hash' do
59
+ include_examples 'identity mapper', :hash do
60
+ let( :value ){ { string: 'test', int: 1337, float: 13.37 } }
61
+ end
62
+ end
63
+
64
+ describe 'advanced hash' do
65
+ expected_hash = {
66
+ string: 'test',
67
+ date_array: [ "2016-01-01", "2016-01-02"],
68
+ nested_hash: { date: "2016-01-03", string: 'test' }
69
+ }
70
+ include_examples 'identity mapper', :hash, expected_hash do
71
+ let( :value ) do
72
+ {
73
+ string: 'test',
74
+ date_array: [Date.new(2016, 1, 1), Date.new(2016, 1, 2)],
75
+ nested_hash: { date: Date.new(2016, 1, 3), string: 'test' }
76
+ }
77
+ end
78
+ end
79
+ end
80
+
81
+ describe 'trueclass' do
82
+ include_examples 'identity mapper', :trueclass do
83
+ let( :value ){ true }
84
+ end
85
+ end
86
+ describe 'falseclass' do
87
+ include_examples 'identity mapper', :falseclass do
88
+ let( :value ){ false }
89
+ end
90
+ end
91
+
92
+ describe 'date' do
93
+ include_examples 'simple mapper', :date, "2016-01-01" do
94
+ let( :value ){ Date.new(2016, 1, 1) }
95
+ end
96
+ end
97
+
98
+ describe 'nilclass' do
99
+ include_examples 'identity mapper', :nilclass do
100
+ let( :value ){ Fortnox::API::Types::Nullable::String[ nil ] }
101
+ end
102
+ end
103
+
104
+ describe 'AccountNumber' do
105
+ include_examples 'identity mapper', :account_number do
106
+ let( :value ){ Fortnox::API::Types::AccountNumber[ 1234 ] }
107
+ end
108
+ end
109
+
110
+ describe 'CountryCode' do
111
+ include_examples 'identity mapper', :country_code do
112
+ let( :value ){ Fortnox::API::Types::CountryCode[ 'SE' ] }
113
+ end
114
+ end
115
+
116
+ describe 'Currency' do
117
+ include_examples 'identity mapper', :currency do
118
+ let( :value ){ Fortnox::API::Types::Currency[ 'SEK' ] }
119
+ end
120
+ end
121
+
122
+ describe 'CustomerType' do
123
+ include_examples 'identity mapper', :customer_type do
124
+ let( :value ){ Fortnox::API::Types::CustomerType[ 'PRIVATE' ] }
125
+ end
126
+ end
127
+
128
+ describe 'DiscountType' do
129
+ include_examples 'identity mapper', :discount_type do
130
+ let( :value ){ Fortnox::API::Types::DiscountType[ 'PERCENT' ] }
131
+ end
132
+ end
133
+
134
+ describe 'Email' do
135
+ include_examples 'identity mapper', :email do
136
+ let( :value ){ Fortnox::API::Types::Email[ 'email@example.com' ] }
137
+ end
138
+ end
139
+
140
+ describe 'HouseWorkType' do
141
+ include_examples 'identity mapper', :house_work_type do
142
+ let( :value ){ Fortnox::API::Types::HouseWorkType[ 'CONSTRUCTION' ] }
143
+ end
144
+ end
145
+
146
+ describe 'VATType' do
147
+ include_examples 'identity mapper', :vat_type do
148
+ let( :value ){ Fortnox::API::Types::VATType[ 'SEVAT' ] }
149
+ end
150
+ end
151
+
152
+ describe '#canonical_name_sym' do
153
+ subject{ described_class.canonical_name_sym }
154
+ it{ is_expected.to eq( described_class.name.split( '::' ).last.downcase.to_sym ) }
155
+ end
156
+ end
@@ -0,0 +1,56 @@
1
+ require 'fortnox/api'
2
+ require 'fortnox/api/mappers'
3
+
4
+ shared_context 'JSON conversion' do
5
+ before do
6
+ module Test
7
+ class BaseMapper
8
+ end
9
+
10
+ class CategoryMapper < BaseMapper
11
+ KEY_MAP = { id: 'ID' }.freeze
12
+ end
13
+
14
+ class ProductDesignerMapper < BaseMapper
15
+ KEY_MAP = { id: 'ID' }.freeze
16
+ end
17
+
18
+ class ProductMapper < BaseMapper
19
+ KEY_MAP = {
20
+ vat: 'VAT',
21
+ url: '@url' # TODO: How to handle url attribute?
22
+ }.freeze
23
+ JSON_ENTITY_WRAPPER = 'Product'.freeze
24
+ JSON_COLLECTION_WRAPPER = 'Products'.freeze
25
+ end
26
+
27
+ class Category < Fortnox::API::Model::Base
28
+ attribute :name, 'strict.string'
29
+ attribute :id, 'strict.string'
30
+ end
31
+
32
+ class ProductDesigner < Fortnox::API::Model::Base
33
+ attribute :name, 'strict.string'
34
+ attribute :id, 'strict.string'
35
+ end
36
+
37
+ class Product < Fortnox::API::Model::Base
38
+ attribute :url, 'strict.string'
39
+ attribute :name, 'strict.string'
40
+ attribute :vat, 'strict.float'
41
+ attribute :categories, Dry::Types['coercible.array'].member( Test::Category )
42
+ attribute :designer, Test::ProductDesigner
43
+ end
44
+ end
45
+
46
+ def register_mapper( mapper_sym, mapper )
47
+ unless Fortnox::API::Registry.key? mapper_sym
48
+ Fortnox::API::Registry.register( mapper_sym, mapper )
49
+ end
50
+ end
51
+
52
+ register_mapper( :category, Test::CategoryMapper)
53
+ register_mapper( :productdesigner, Test::ProductDesignerMapper )
54
+ register_mapper( :product, Test::ProductMapper )
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers/customer'
4
+ require 'fortnox/api/mappers/examples/mapper'
5
+
6
+ describe Fortnox::API::Mapper::Customer do
7
+ key_map =
8
+ {
9
+ vat_type: 'VATType',
10
+ vat_number: 'VATNumber',
11
+ email_invoice_bcc: 'EmailInvoiceBCC',
12
+ email_invoice_cc: 'EmailInvoiceCC',
13
+ email_offer_bcc: 'EmailOfferBCC',
14
+ email_offer_cc: 'EmailOfferCC',
15
+ email_order_bcc: 'EmailOrderBCC',
16
+ email_order_cc: 'EmailOrderCC',
17
+ show_price_vat_included: 'ShowPriceVATIncluded'
18
+ }
19
+ json_entity_type = 'Customer'
20
+ json_entity_collection = 'Customers'
21
+
22
+ it_behaves_like 'mapper', key_map, json_entity_type, json_entity_collection do
23
+ let(:mapper){ described_class.new }
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers/default_delivery_types'
4
+ require 'fortnox/api/mappers/examples/mapper'
5
+
6
+ describe Fortnox::API::Mapper::DefaultDeliveryTypes do
7
+ key_map = {}
8
+
9
+ it_behaves_like 'mapper', key_map do
10
+ let(:mapper){ described_class.new }
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers/edi_information'
4
+ require 'fortnox/api/mappers/examples/mapper'
5
+
6
+ describe Fortnox::API::Mapper::EDIInformation do
7
+ key_map = {
8
+ edi_global_location_number: 'EDIGlobalLocationNumber',
9
+ edi_global_location_number_delivery: 'EDIGlobalLocationNumberDelivery',
10
+ edi_invoice_extra1: 'EDIInvoiceExtra1',
11
+ edi_invoice_extra2: 'EDIInvoiceExtra2',
12
+ edi_our_electronic_reference: 'EDIOurElectronicReference',
13
+ edi_your_electronic_reference: 'EDIYourElectronicReference'
14
+ }
15
+ json_entity_type = 'EDIInformation'
16
+ json_entity_collection = 'EDIInformation'
17
+
18
+ it_behaves_like 'mapper', key_map, json_entity_type, json_entity_collection do
19
+ let(:mapper){ described_class.new }
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers/email_information'
4
+ require 'fortnox/api/mappers/examples/mapper'
5
+
6
+ describe Fortnox::API::Mapper::EmailInformation do
7
+ key_map = {
8
+ email_address_bcc: 'EmailAddressBCC',
9
+ email_address_cc: 'EmailAddressCC'
10
+ }
11
+ json_entity_type = 'EmailInformation'
12
+ json_entity_collection = 'EmailInformation'
13
+
14
+ it_behaves_like 'mapper', key_map, json_entity_type, json_entity_collection do
15
+ let(:mapper){ described_class.new }
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ shared_examples_for 'mapper' do |key_map, json_entity_wrapper = nil, json_collection_wrapper = nil, check_constants: true|
2
+ it{ is_expected.to respond_to(:wrapped_json_collection_to_entities_hash) }
3
+ it{ is_expected.to respond_to(:wrapped_json_hash_to_entity_hash) }
4
+ it{ is_expected.to respond_to(:entity_to_hash) }
5
+
6
+ if check_constants
7
+ describe 'key_map' do
8
+ subject{ described_class::KEY_MAP }
9
+ it{ is_expected.to eq(key_map) }
10
+ end
11
+
12
+ unless json_entity_wrapper.nil?
13
+ describe 'json_entity_wrapper' do
14
+ subject{ described_class::JSON_ENTITY_WRAPPER }
15
+ it{ is_expected.to eq(json_entity_wrapper) }
16
+ end
17
+ end
18
+
19
+ unless json_collection_wrapper.nil?
20
+ describe 'json_collection_wrapper' do
21
+ subject{ described_class::JSON_COLLECTION_WRAPPER }
22
+ it{ is_expected.to eq(json_collection_wrapper) }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers/invoice_row'
4
+ require 'fortnox/api/mappers/examples/mapper'
5
+
6
+ describe Fortnox::API::Mapper::InvoiceRow do
7
+ key_map = {
8
+ vat: 'VAT',
9
+ price_excluding_vat: 'PriceExcludingVAT',
10
+ total_excluding_vat: 'TotalExcludingVAT'
11
+ }
12
+
13
+ json_entity_type = 'InvoiceRow'
14
+ json_entity_collection = 'InvoiceRows'
15
+
16
+ it_behaves_like 'mapper', key_map, json_entity_type, json_entity_collection do
17
+ let(:mapper){ described_class.new }
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers/invoice'
4
+ require 'fortnox/api/mappers/examples/mapper'
5
+
6
+ describe Fortnox::API::Mapper::Invoice do
7
+ key_map =
8
+ {
9
+ administration_fee_vat: 'AdministrationFeeVAT',
10
+ edi_information: 'EDIInformation',
11
+ eu_quarterly_report: 'EUQuarterlyReport',
12
+ freight_vat: 'FreightVAT',
13
+ ocr: 'OCR',
14
+ total_vat: 'TotalVAT',
15
+ vat_included: 'VATIncluded'
16
+ }
17
+
18
+ json_entity_type = 'Invoice'
19
+ json_entity_collection = 'Invoices'
20
+
21
+ it_behaves_like 'mapper', key_map, json_entity_type, json_entity_collection do
22
+ let(:mapper){ described_class.new }
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ require 'fortnox/api'
3
+ require 'fortnox/api/mappers/order_row'
4
+ require 'fortnox/api/mappers/examples/mapper'
5
+
6
+ describe Fortnox::API::Mapper::OrderRow do
7
+ key_map = { vat: 'VAT' }
8
+ json_entity_type = 'OrderRow'
9
+ json_entity_collection = 'OrderRows'
10
+
11
+ it_behaves_like 'mapper', key_map, json_entity_type, json_entity_collection do
12
+ let(:mapper){ described_class.new }
13
+ end
14
+ end