fortnox-api 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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