fortnox-api 0.9.2 → 1.0.0.rc2

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 (344) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +120 -95
  3. data/{LICENSE.txt → LICENSE.md} +0 -0
  4. data/README.md +245 -248
  5. data/bin/fortnox-setup +211 -0
  6. data/bin/fortnox-update-env +38 -0
  7. data/fortnox.gemspec +29 -0
  8. data/lib/fortnox/auth/thread_local.rb +28 -0
  9. data/lib/fortnox/collection.rb +23 -0
  10. data/lib/fortnox/mappers/country_code.rb +34 -0
  11. data/lib/fortnox/mappers/date.rb +21 -0
  12. data/lib/fortnox/mappers/document_row.rb +12 -0
  13. data/lib/fortnox/mappers/edi_information.rb +15 -0
  14. data/lib/fortnox/mappers/email_information.rb +11 -0
  15. data/lib/fortnox/mappers/invoice_row.rb +14 -0
  16. data/lib/fortnox/mappers/label_references.rb +24 -0
  17. data/lib/fortnox/mappers/order_row.rb +9 -0
  18. data/lib/fortnox/mappers/struct.rb +71 -0
  19. data/lib/fortnox/mappers/struct_array.rb +31 -0
  20. data/lib/fortnox/resource.rb +131 -0
  21. data/lib/fortnox/resources/article.rb +160 -0
  22. data/lib/fortnox/resources/customer.rb +209 -0
  23. data/lib/fortnox/resources/document.rb +202 -0
  24. data/lib/fortnox/resources/invoice.rb +92 -0
  25. data/lib/fortnox/resources/label.rb +15 -0
  26. data/lib/fortnox/resources/order.rb +38 -0
  27. data/lib/fortnox/resources/project.rb +41 -0
  28. data/lib/fortnox/resources/terms_of_payment.rb +23 -0
  29. data/lib/fortnox/resources/unit.rb +26 -0
  30. data/lib/fortnox/struct.rb +24 -0
  31. data/lib/fortnox/structs/default_delivery_types.rb +16 -0
  32. data/lib/fortnox/structs/default_templates.rb +19 -0
  33. data/lib/fortnox/structs/document_row.rb +62 -0
  34. data/lib/fortnox/structs/edi_information.rb +25 -0
  35. data/lib/fortnox/structs/email_information.rb +22 -0
  36. data/lib/fortnox/structs/invoice_row.rb +13 -0
  37. data/lib/fortnox/structs/order_row.rb +10 -0
  38. data/lib/fortnox/types.rb +129 -0
  39. data/lib/fortnox/{api/version.rb → version.rb} +1 -3
  40. data/lib/fortnox.rb +111 -0
  41. metadata +55 -580
  42. data/.codeclimate.yml +0 -20
  43. data/.env.template +0 -7
  44. data/.env.test +0 -11
  45. data/.gitignore +0 -20
  46. data/.rspec +0 -2
  47. data/.rubocop.yml +0 -41
  48. data/.tool-versions +0 -1
  49. data/.travis.yml +0 -32
  50. data/CLAUDE.md +0 -79
  51. data/CONTRIBUTE.md +0 -38
  52. data/DEVELOPER_README.md +0 -69
  53. data/Gemfile +0 -6
  54. data/Guardfile +0 -16
  55. data/Rakefile +0 -140
  56. data/bin/console +0 -22
  57. data/bin/fortnox +0 -285
  58. data/bin/get_tokens +0 -79
  59. data/bin/renew_tokens +0 -28
  60. data/docs/gotchas.md +0 -146
  61. data/fortnox-api.gemspec +0 -50
  62. data/lib/fortnox/api/mappers/article.rb +0 -23
  63. data/lib/fortnox/api/mappers/base/canonical_name_sym.rb +0 -21
  64. data/lib/fortnox/api/mappers/base/from_json.rb +0 -91
  65. data/lib/fortnox/api/mappers/base/to_json.rb +0 -66
  66. data/lib/fortnox/api/mappers/base.rb +0 -30
  67. data/lib/fortnox/api/mappers/customer.rb +0 -27
  68. data/lib/fortnox/api/mappers/default_delivery_types.rb +0 -15
  69. data/lib/fortnox/api/mappers/default_templates.rb +0 -16
  70. data/lib/fortnox/api/mappers/edi_information.rb +0 -23
  71. data/lib/fortnox/api/mappers/email_information.rb +0 -19
  72. data/lib/fortnox/api/mappers/invoice.rb +0 -29
  73. data/lib/fortnox/api/mappers/invoice_row.rb +0 -25
  74. data/lib/fortnox/api/mappers/order.rb +0 -26
  75. data/lib/fortnox/api/mappers/order_row.rb +0 -23
  76. data/lib/fortnox/api/mappers/project.rb +0 -17
  77. data/lib/fortnox/api/mappers/terms_of_payment.rb +0 -17
  78. data/lib/fortnox/api/mappers/unit.rb +0 -17
  79. data/lib/fortnox/api/mappers/value/array.rb +0 -18
  80. data/lib/fortnox/api/mappers/value/country_string.rb +0 -24
  81. data/lib/fortnox/api/mappers/value/date.rb +0 -11
  82. data/lib/fortnox/api/mappers/value/hash.rb +0 -16
  83. data/lib/fortnox/api/mappers/value/identity.rb +0 -18
  84. data/lib/fortnox/api/mappers.rb +0 -21
  85. data/lib/fortnox/api/models/article.rb +0 -134
  86. data/lib/fortnox/api/models/base.rb +0 -128
  87. data/lib/fortnox/api/models/customer.rb +0 -210
  88. data/lib/fortnox/api/models/document.rb +0 -189
  89. data/lib/fortnox/api/models/invoice.rb +0 -87
  90. data/lib/fortnox/api/models/label.rb +0 -19
  91. data/lib/fortnox/api/models/order.rb +0 -27
  92. data/lib/fortnox/api/models/project.rb +0 -42
  93. data/lib/fortnox/api/models/terms_of_payment.rb +0 -28
  94. data/lib/fortnox/api/models/unit.rb +0 -24
  95. data/lib/fortnox/api/models.rb +0 -9
  96. data/lib/fortnox/api/repositories/article.rb +0 -17
  97. data/lib/fortnox/api/repositories/authentication.rb +0 -61
  98. data/lib/fortnox/api/repositories/base/loaders.rb +0 -64
  99. data/lib/fortnox/api/repositories/base/savers.rb +0 -57
  100. data/lib/fortnox/api/repositories/base.rb +0 -93
  101. data/lib/fortnox/api/repositories/customer.rb +0 -17
  102. data/lib/fortnox/api/repositories/invoice.rb +0 -17
  103. data/lib/fortnox/api/repositories/order.rb +0 -17
  104. data/lib/fortnox/api/repositories/project.rb +0 -17
  105. data/lib/fortnox/api/repositories/terms_of_payment.rb +0 -17
  106. data/lib/fortnox/api/repositories/unit.rb +0 -17
  107. data/lib/fortnox/api/repositories.rb +0 -10
  108. data/lib/fortnox/api/request_handling.rb +0 -46
  109. data/lib/fortnox/api/types/default_delivery_types.rb +0 -20
  110. data/lib/fortnox/api/types/default_templates.rb +0 -23
  111. data/lib/fortnox/api/types/defaulted.rb +0 -11
  112. data/lib/fortnox/api/types/document_row.rb +0 -64
  113. data/lib/fortnox/api/types/edi_information.rb +0 -29
  114. data/lib/fortnox/api/types/email_information.rb +0 -26
  115. data/lib/fortnox/api/types/enums.rb +0 -116
  116. data/lib/fortnox/api/types/invoice_row.rb +0 -19
  117. data/lib/fortnox/api/types/model.rb +0 -37
  118. data/lib/fortnox/api/types/nullable.rb +0 -25
  119. data/lib/fortnox/api/types/order_row.rb +0 -16
  120. data/lib/fortnox/api/types/required.rb +0 -13
  121. data/lib/fortnox/api/types/shim/country_string.rb +0 -10
  122. data/lib/fortnox/api/types/sized.rb +0 -33
  123. data/lib/fortnox/api/types.rb +0 -144
  124. data/lib/fortnox/api.rb +0 -62
  125. data/spec/fortnox/api/mappers/article_spec.rb +0 -17
  126. data/spec/fortnox/api/mappers/base/canonical_name_sym_spec.rb +0 -36
  127. data/spec/fortnox/api/mappers/base/from_json_spec.rb +0 -70
  128. data/spec/fortnox/api/mappers/base/to_json_spec.rb +0 -68
  129. data/spec/fortnox/api/mappers/base_spec.rb +0 -154
  130. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +0 -62
  131. data/spec/fortnox/api/mappers/customer_spec.rb +0 -27
  132. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +0 -14
  133. data/spec/fortnox/api/mappers/edi_information_spec.rb +0 -23
  134. data/spec/fortnox/api/mappers/email_information_spec.rb +0 -19
  135. data/spec/fortnox/api/mappers/examples/mapper.rb +0 -34
  136. data/spec/fortnox/api/mappers/invoice_row_spec.rb +0 -24
  137. data/spec/fortnox/api/mappers/invoice_spec.rb +0 -27
  138. data/spec/fortnox/api/mappers/order_row_spec.rb +0 -21
  139. data/spec/fortnox/api/mappers/order_spec.rb +0 -23
  140. data/spec/fortnox/api/mappers/project_spec.rb +0 -12
  141. data/spec/fortnox/api/mappers/terms_of_payment_spec.rb +0 -16
  142. data/spec/fortnox/api/mappers/unit_spec.rb +0 -56
  143. data/spec/fortnox/api/models/article_spec.rb +0 -9
  144. data/spec/fortnox/api/models/base_spec.rb +0 -117
  145. data/spec/fortnox/api/models/customer_spec.rb +0 -9
  146. data/spec/fortnox/api/models/examples/document_base.rb +0 -15
  147. data/spec/fortnox/api/models/examples/model.rb +0 -22
  148. data/spec/fortnox/api/models/invoice_spec.rb +0 -11
  149. data/spec/fortnox/api/models/order_spec.rb +0 -12
  150. data/spec/fortnox/api/models/project_spec.rb +0 -9
  151. data/spec/fortnox/api/models/terms_of_payment_spec.rb +0 -9
  152. data/spec/fortnox/api/models/unit_spec.rb +0 -33
  153. data/spec/fortnox/api/repositories/article_spec.rb +0 -80
  154. data/spec/fortnox/api/repositories/authentication_spec.rb +0 -103
  155. data/spec/fortnox/api/repositories/base_spec.rb +0 -168
  156. data/spec/fortnox/api/repositories/customer_spec.rb +0 -119
  157. data/spec/fortnox/api/repositories/examples/all.rb +0 -17
  158. data/spec/fortnox/api/repositories/examples/find.rb +0 -84
  159. data/spec/fortnox/api/repositories/examples/only.rb +0 -34
  160. data/spec/fortnox/api/repositories/examples/save.rb +0 -76
  161. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +0 -28
  162. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +0 -26
  163. data/spec/fortnox/api/repositories/examples/search.rb +0 -39
  164. data/spec/fortnox/api/repositories/invoice_spec.rb +0 -297
  165. data/spec/fortnox/api/repositories/order_spec.rb +0 -53
  166. data/spec/fortnox/api/repositories/project_spec.rb +0 -36
  167. data/spec/fortnox/api/repositories/terms_of_payment_spec.rb +0 -34
  168. data/spec/fortnox/api/repositories/unit_spec.rb +0 -39
  169. data/spec/fortnox/api/types/account_number_spec.rb +0 -35
  170. data/spec/fortnox/api/types/country_code_spec.rb +0 -42
  171. data/spec/fortnox/api/types/country_spec.rb +0 -67
  172. data/spec/fortnox/api/types/default_delivery_types_spec.rb +0 -12
  173. data/spec/fortnox/api/types/edi_information_spec.rb +0 -15
  174. data/spec/fortnox/api/types/email_information_spec.rb +0 -15
  175. data/spec/fortnox/api/types/email_spec.rb +0 -56
  176. data/spec/fortnox/api/types/enums_spec.rb +0 -17
  177. data/spec/fortnox/api/types/examples/document_row.rb +0 -25
  178. data/spec/fortnox/api/types/examples/enum.rb +0 -55
  179. data/spec/fortnox/api/types/examples/types.rb +0 -11
  180. data/spec/fortnox/api/types/housework_types_spec.rb +0 -149
  181. data/spec/fortnox/api/types/invoice_row_spec.rb +0 -11
  182. data/spec/fortnox/api/types/model_spec.rb +0 -69
  183. data/spec/fortnox/api/types/nullable_spec.rb +0 -79
  184. data/spec/fortnox/api/types/order_row_spec.rb +0 -15
  185. data/spec/fortnox/api/types/required_spec.rb +0 -36
  186. data/spec/fortnox/api/types/sales_account_spec.rb +0 -57
  187. data/spec/fortnox/api/types/sized_spec.rb +0 -76
  188. data/spec/fortnox/api_spec.rb +0 -66
  189. data/spec/spec_helper.rb +0 -35
  190. data/spec/support/helpers/configuration_helper.rb +0 -39
  191. data/spec/support/helpers/repository_helper.rb +0 -10
  192. data/spec/support/helpers.rb +0 -3
  193. data/spec/support/matchers/type/attribute_matcher.rb +0 -40
  194. data/spec/support/matchers/type/enum_matcher.rb +0 -23
  195. data/spec/support/matchers/type/have_account_number_matcher.rb +0 -23
  196. data/spec/support/matchers/type/have_currency_matcher.rb +0 -9
  197. data/spec/support/matchers/type/have_customer_type_matcher.rb +0 -15
  198. data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +0 -9
  199. data/spec/support/matchers/type/have_discount_type_matcher.rb +0 -9
  200. data/spec/support/matchers/type/have_email_matcher.rb +0 -24
  201. data/spec/support/matchers/type/have_housework_type_matcher.rb +0 -9
  202. data/spec/support/matchers/type/have_nullable_date_matcher.rb +0 -60
  203. data/spec/support/matchers/type/have_nullable_matcher.rb +0 -54
  204. data/spec/support/matchers/type/have_nullable_string_matcher.rb +0 -47
  205. data/spec/support/matchers/type/have_sized_float_matcher.rb +0 -10
  206. data/spec/support/matchers/type/have_sized_integer_matcher.rb +0 -10
  207. data/spec/support/matchers/type/have_sized_string_matcher.rb +0 -36
  208. data/spec/support/matchers/type/have_vat_type_matcher.rb +0 -9
  209. data/spec/support/matchers/type/numeric_matcher.rb +0 -52
  210. data/spec/support/matchers/type/require_attribute_matcher.rb +0 -68
  211. data/spec/support/matchers/type/type_matcher.rb +0 -40
  212. data/spec/support/matchers/type.rb +0 -19
  213. data/spec/support/matchers.rb +0 -3
  214. data/spec/support/vcr_setup.rb +0 -25
  215. data/spec/vcr_cassettes/articles/all.yml +0 -67
  216. data/spec/vcr_cassettes/articles/find_by_hash_failure.yml +0 -62
  217. data/spec/vcr_cassettes/articles/find_failure.yml +0 -62
  218. data/spec/vcr_cassettes/articles/find_id_1.yml +0 -63
  219. data/spec/vcr_cassettes/articles/find_new.yml +0 -63
  220. data/spec/vcr_cassettes/articles/limits/quantity_in_stock_min_value.yml +0 -63
  221. data/spec/vcr_cassettes/articles/limits/quantity_in_stock_rounding_positive_value.yml +0 -63
  222. data/spec/vcr_cassettes/articles/multi_param_find_by_hash.yml +0 -62
  223. data/spec/vcr_cassettes/articles/save_new.yml +0 -63
  224. data/spec/vcr_cassettes/articles/save_old.yml +0 -63
  225. data/spec/vcr_cassettes/articles/save_with_specially_named_attribute.yml +0 -63
  226. data/spec/vcr_cassettes/articles/search_by_name.yml +0 -65
  227. data/spec/vcr_cassettes/articles/search_miss.yml +0 -62
  228. data/spec/vcr_cassettes/articles/search_with_special_char.yml +0 -62
  229. data/spec/vcr_cassettes/articles/single_param_find_by_hash.yml +0 -62
  230. data/spec/vcr_cassettes/authentication/expired_token.yml +0 -54
  231. data/spec/vcr_cassettes/authentication/invalid_authorization.yml +0 -57
  232. data/spec/vcr_cassettes/authentication/invalid_refresh_token.yml +0 -58
  233. data/spec/vcr_cassettes/authentication/valid_request.yml +0 -63
  234. data/spec/vcr_cassettes/customers/all.yml +0 -69
  235. data/spec/vcr_cassettes/customers/find_by_hash_failure.yml +0 -62
  236. data/spec/vcr_cassettes/customers/find_failure.yml +0 -62
  237. data/spec/vcr_cassettes/customers/find_id_1.yml +0 -64
  238. data/spec/vcr_cassettes/customers/find_new.yml +0 -63
  239. data/spec/vcr_cassettes/customers/find_with_sales_account.yml +0 -63
  240. data/spec/vcr_cassettes/customers/multi_param_find_by_hash.yml +0 -63
  241. data/spec/vcr_cassettes/customers/save_new.yml +0 -63
  242. data/spec/vcr_cassettes/customers/save_new_with_country_code_SE.yml +0 -64
  243. data/spec/vcr_cassettes/customers/save_new_with_idn_email.yml +0 -67
  244. data/spec/vcr_cassettes/customers/save_new_with_sales_account.yml +0 -63
  245. data/spec/vcr_cassettes/customers/save_old.yml +0 -63
  246. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +0 -63
  247. data/spec/vcr_cassettes/customers/search_by_name.yml +0 -64
  248. data/spec/vcr_cassettes/customers/search_miss.yml +0 -62
  249. data/spec/vcr_cassettes/customers/search_with_special_char.yml +0 -62
  250. data/spec/vcr_cassettes/customers/single_param_find_by_hash.yml +0 -64
  251. data/spec/vcr_cassettes/invoices/all.yml +0 -96
  252. data/spec/vcr_cassettes/invoices/filter_hit.yml +0 -64
  253. data/spec/vcr_cassettes/invoices/filter_invalid.yml +0 -60
  254. data/spec/vcr_cassettes/invoices/find_by_hash_failure.yml +0 -62
  255. data/spec/vcr_cassettes/invoices/find_failure.yml +0 -62
  256. data/spec/vcr_cassettes/invoices/find_id_1.yml +0 -65
  257. data/spec/vcr_cassettes/invoices/find_new.yml +0 -65
  258. data/spec/vcr_cassettes/invoices/multi_param_find_by_hash.yml +0 -63
  259. data/spec/vcr_cassettes/invoices/row_delivered_quantity_decimals.yml +0 -65
  260. data/spec/vcr_cassettes/invoices/row_delivered_quantity_decimals_round_up.yml +0 -65
  261. data/spec/vcr_cassettes/invoices/row_description_limit.yml +0 -65
  262. data/spec/vcr_cassettes/invoices/row_price_limit.yml +0 -65
  263. data/spec/vcr_cassettes/invoices/row_price_limit_round_up.yml +0 -65
  264. data/spec/vcr_cassettes/invoices/save_new.yml +0 -65
  265. data/spec/vcr_cassettes/invoices/save_new_with_comments.yml +0 -65
  266. data/spec/vcr_cassettes/invoices/save_new_with_country.yml +0 -65
  267. data/spec/vcr_cassettes/invoices/save_new_with_country_GB.yml +0 -66
  268. data/spec/vcr_cassettes/invoices/save_new_with_country_Norge.yml +0 -65
  269. data/spec/vcr_cassettes/invoices/save_new_with_country_Norway.yml +0 -65
  270. data/spec/vcr_cassettes/invoices/save_new_with_country_Sverige.yml +0 -65
  271. data/spec/vcr_cassettes/invoices/save_new_with_country_VA.yml +0 -66
  272. data/spec/vcr_cassettes/invoices/save_new_with_country_VI.yml +0 -66
  273. data/spec/vcr_cassettes/invoices/save_new_with_country_empty_string.yml +0 -65
  274. data/spec/vcr_cassettes/invoices/save_new_with_country_nil.yml +0 -65
  275. data/spec/vcr_cassettes/invoices/save_new_with_unsaved_parent.yml +0 -65
  276. data/spec/vcr_cassettes/invoices/save_old.yml +0 -65
  277. data/spec/vcr_cassettes/invoices/save_old_with_empty_comments.yml +0 -65
  278. data/spec/vcr_cassettes/invoices/save_old_with_empty_country.yml +0 -65
  279. data/spec/vcr_cassettes/invoices/save_old_with_nil_comments.yml +0 -65
  280. data/spec/vcr_cassettes/invoices/save_old_with_nil_country.yml +0 -65
  281. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +0 -65
  282. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +0 -65
  283. data/spec/vcr_cassettes/invoices/search_by_name.yml +0 -63
  284. data/spec/vcr_cassettes/invoices/search_miss.yml +0 -62
  285. data/spec/vcr_cassettes/invoices/search_with_special_char.yml +0 -62
  286. data/spec/vcr_cassettes/invoices/single_param_find_by_hash.yml +0 -64
  287. data/spec/vcr_cassettes/orders/all.yml +0 -69
  288. data/spec/vcr_cassettes/orders/filter_hit.yml +0 -64
  289. data/spec/vcr_cassettes/orders/filter_invalid.yml +0 -60
  290. data/spec/vcr_cassettes/orders/find_by_hash_failure.yml +0 -62
  291. data/spec/vcr_cassettes/orders/find_failure.yml +0 -62
  292. data/spec/vcr_cassettes/orders/find_id_1.yml +0 -67
  293. data/spec/vcr_cassettes/orders/find_new.yml +0 -65
  294. data/spec/vcr_cassettes/orders/housework_invalid_tax_reduction_type.yml +0 -61
  295. data/spec/vcr_cassettes/orders/housework_othercoses_invalid.yml +0 -61
  296. data/spec/vcr_cassettes/orders/housework_type_babysitting.yml +0 -65
  297. data/spec/vcr_cassettes/orders/housework_type_cleaning.yml +0 -65
  298. data/spec/vcr_cassettes/orders/housework_type_construction.yml +0 -65
  299. data/spec/vcr_cassettes/orders/housework_type_cooking.yml +0 -61
  300. data/spec/vcr_cassettes/orders/housework_type_electricity.yml +0 -65
  301. data/spec/vcr_cassettes/orders/housework_type_gardening.yml +0 -65
  302. data/spec/vcr_cassettes/orders/housework_type_glassmetalwork.yml +0 -65
  303. data/spec/vcr_cassettes/orders/housework_type_grounddrainagework.yml +0 -65
  304. data/spec/vcr_cassettes/orders/housework_type_hvac.yml +0 -65
  305. data/spec/vcr_cassettes/orders/housework_type_itservices.yml +0 -65
  306. data/spec/vcr_cassettes/orders/housework_type_majorappliancerepair.yml +0 -65
  307. data/spec/vcr_cassettes/orders/housework_type_masonry.yml +0 -65
  308. data/spec/vcr_cassettes/orders/housework_type_movingservices.yml +0 -65
  309. data/spec/vcr_cassettes/orders/housework_type_othercare.yml +0 -65
  310. data/spec/vcr_cassettes/orders/housework_type_othercosts.yml +0 -65
  311. data/spec/vcr_cassettes/orders/housework_type_paintingwallpapering.yml +0 -65
  312. data/spec/vcr_cassettes/orders/housework_type_snowplowing.yml +0 -65
  313. data/spec/vcr_cassettes/orders/housework_type_textileclothing.yml +0 -65
  314. data/spec/vcr_cassettes/orders/housework_type_tutoring.yml +0 -61
  315. data/spec/vcr_cassettes/orders/multi_param_find_by_hash.yml +0 -63
  316. data/spec/vcr_cassettes/orders/save_new.yml +0 -65
  317. data/spec/vcr_cassettes/orders/save_old.yml +0 -65
  318. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +0 -65
  319. data/spec/vcr_cassettes/orders/search_by_name.yml +0 -63
  320. data/spec/vcr_cassettes/orders/search_miss.yml +0 -62
  321. data/spec/vcr_cassettes/orders/search_with_special_char.yml +0 -62
  322. data/spec/vcr_cassettes/orders/single_param_find_by_hash.yml +0 -64
  323. data/spec/vcr_cassettes/projects/all.yml +0 -64
  324. data/spec/vcr_cassettes/projects/find_by_hash_failure.yml +0 -62
  325. data/spec/vcr_cassettes/projects/find_failure.yml +0 -62
  326. data/spec/vcr_cassettes/projects/find_id_1.yml +0 -63
  327. data/spec/vcr_cassettes/projects/find_new.yml +0 -63
  328. data/spec/vcr_cassettes/projects/multi_param_find_by_hash.yml +0 -64
  329. data/spec/vcr_cassettes/projects/save_new.yml +0 -63
  330. data/spec/vcr_cassettes/projects/save_old.yml +0 -63
  331. data/spec/vcr_cassettes/projects/single_param_find_by_hash.yml +0 -63
  332. data/spec/vcr_cassettes/termsofpayments/all.yml +0 -68
  333. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +0 -62
  334. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +0 -62
  335. data/spec/vcr_cassettes/termsofpayments/find_new.yml +0 -63
  336. data/spec/vcr_cassettes/termsofpayments/save_new.yml +0 -63
  337. data/spec/vcr_cassettes/termsofpayments/save_old.yml +0 -63
  338. data/spec/vcr_cassettes/units/all.yml +0 -64
  339. data/spec/vcr_cassettes/units/find_failure.yml +0 -62
  340. data/spec/vcr_cassettes/units/find_id_1.yml +0 -63
  341. data/spec/vcr_cassettes/units/find_new.yml +0 -63
  342. data/spec/vcr_cassettes/units/save_new.yml +0 -63
  343. data/spec/vcr_cassettes/units/save_old.yml +0 -63
  344. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +0 -63
@@ -1,297 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api'
5
- require 'fortnox/api/mappers'
6
- require 'fortnox/api/repositories/invoice'
7
- require 'fortnox/api/repositories/examples/all'
8
- require 'fortnox/api/repositories/examples/find'
9
- require 'fortnox/api/repositories/examples/search'
10
- require 'fortnox/api/repositories/examples/save'
11
- require 'fortnox/api/repositories/examples/save_with_nested_model'
12
- require 'fortnox/api/repositories/examples/save_with_specially_named_attribute'
13
- require 'fortnox/api/repositories/examples/only'
14
-
15
- describe Fortnox::API::Repository::Invoice, integration: true, order: :defined do
16
- include Helpers::Configuration
17
- include Helpers::Repositories
18
-
19
- subject(:repository) { described_class.new }
20
-
21
- before { set_api_test_configuration }
22
-
23
- required_hash = { customer_number: '1' }
24
-
25
- include_examples '.save', :comments, additional_attrs: required_hash
26
-
27
- describe '#save' do
28
- context 'with unsaved parent' do
29
- subject(:saved_child) do
30
- parent_invoice = Fortnox::API::Model::Invoice.new(customer_number: '1')
31
- child_invoice = parent_invoice.update(due_date: '2023-01-01')
32
-
33
- VCR.use_cassette("#{vcr_dir}/save_new_with_unsaved_parent") do
34
- described_class.new.save(child_invoice)
35
- end
36
- end
37
-
38
- it 'sets attribute from parent when saved' do
39
- expect(saved_child.customer_number).to eq '1'
40
- end
41
- end
42
- end
43
-
44
- nested_model_hash = { price: 10, article_number: '101' }
45
- include_examples '.save with nested model',
46
- required_hash,
47
- :invoice_rows,
48
- nested_model_hash,
49
- [Fortnox::API::Types::InvoiceRow.new(nested_model_hash)]
50
-
51
- include_examples '.save with specially named attribute',
52
- required_hash,
53
- :ocr,
54
- '426523791'
55
-
56
- # It is not possible to delete Invoces. Therefore, expected nr of Orders
57
- # when running .all will continue to increase (until 100, which is max by default).
58
- include_examples '.all', 34
59
-
60
- # VCR: Models needs to be created manually in Fortnox
61
- include_examples '.find', 1 do
62
- let(:find_by_hash_failure) { { yourreference: 'Not found' } }
63
-
64
- let(:single_param_find_by_hash) do
65
- { find_hash: { yourreference: 'Gandalf the Grey' }, matches: 2 }
66
- end
67
- let(:multi_param_find_by_hash) do
68
- { find_hash: { yourreference: 'Gandalf the Grey', ourreference: 'Radagast the Brown' },
69
- matches: 1 }
70
- end
71
- end
72
-
73
- include_examples '.search', :customername, 'Test', 1
74
-
75
- # VCR: Need to be set manually in Fortnox
76
- include_examples '.only', :fullypaid, 2
77
-
78
- describe 'country attribute' do
79
- def new_invoice(country:)
80
- described_class::MODEL.new(customer_number: 1, country: country)
81
- end
82
-
83
- context 'with valid country' do
84
- def save_invoice(country:, vcr_cassette: country)
85
- VCR.use_cassette("#{vcr_dir}/save_new_with_country_#{vcr_cassette}") do
86
- repository.save(new_invoice(country: country))
87
- end
88
- end
89
-
90
- it 'accepts English country names' do
91
- expect(save_invoice(country: 'Norway').country).to eq('NO')
92
- end
93
-
94
- it 'translates Swedish country names to English' do
95
- expect(save_invoice(country: 'Norge').country).to eq('NO')
96
- end
97
-
98
- it 'skips nil values' do
99
- expect(save_invoice(country: nil, vcr_cassette: 'nil').country).to eq('')
100
- end
101
-
102
- it 'skips empty string values' do
103
- expect(save_invoice(country: '', vcr_cassette: 'empty_string').country).to eq('')
104
- end
105
-
106
- describe 'GB' do
107
- subject { save_invoice(country: 'GB').country }
108
-
109
- it { is_expected.to eq('GB') }
110
- end
111
-
112
- describe 'VA' do
113
- subject { save_invoice(country: 'VA').country }
114
-
115
- it { is_expected.to eq('VA') }
116
- end
117
-
118
- describe 'VI' do
119
- subject { save_invoice(country: 'VI').country }
120
-
121
- it { is_expected.to eq('VI') }
122
- end
123
-
124
- describe 'special cases Sverige' do
125
- subject { save_invoice(country: 'Sverige').country }
126
-
127
- it { is_expected.to eq('SE') }
128
- end
129
- end
130
- end
131
-
132
- describe 'resetting values in Fortnox' do
133
- context 'with String values' do
134
- def new_invoice(comments:)
135
- described_class::MODEL.new(customer_number: 1, comments: comments)
136
- end
137
-
138
- let(:persisted_invoice) do
139
- VCR.use_cassette("#{vcr_dir}/save_new_with_comments") do
140
- repository.save(new_invoice(comments: 'A comment to be reset'))
141
- end
142
- end
143
-
144
- before { persisted_invoice }
145
-
146
- context 'when setting value to nil' do
147
- subject(:comments) { updated_persisted_invoice.comments }
148
-
149
- let(:updated_persisted_invoice) do
150
- VCR.use_cassette("#{vcr_dir}/save_old_with_nil_comments") do
151
- repository.save(persisted_invoice.update(comments: nil))
152
- end
153
- end
154
-
155
- it do
156
- pending "test to rerecord VCR cassette, maybe it's working now"
157
- expect(comments).to be_nil
158
- end
159
- end
160
-
161
- context 'when setting value to empty string' do
162
- subject(:comments) { updated_persisted_invoice.comments }
163
-
164
- let(:updated_persisted_invoice) do
165
- VCR.use_cassette("#{vcr_dir}/save_old_with_empty_comments") do
166
- repository.save(persisted_invoice.update(comments: ''))
167
- end
168
- end
169
-
170
- it 'does not reset the value' do
171
- expect(comments).to eq('A comment to be reset')
172
- end
173
- end
174
- end
175
-
176
- context 'with other values' do
177
- def new_invoice(country:)
178
- described_class::MODEL.new(customer_number: 1, country: country)
179
- end
180
-
181
- let(:persisted_invoice) do
182
- VCR.use_cassette("#{vcr_dir}/save_new_with_country") do
183
- repository.save(new_invoice(country: 'Sverige'))
184
- end
185
- end
186
-
187
- before { persisted_invoice }
188
-
189
- context 'when setting value to nil' do
190
- subject(:country) { updated_persisted_invoice.country }
191
-
192
- let(:updated_persisted_invoice) do
193
- # TODO: This VCR cassette needs to be re-recorded again
194
- # when the we fix #172.
195
- VCR.use_cassette("#{vcr_dir}/save_old_with_nil_country") do
196
- repository.save(persisted_invoice.update(country: nil))
197
- end
198
- end
199
-
200
- it 'is nil' do
201
- pending 'see comment above'
202
- expect(country).to be_nil
203
- end
204
- end
205
-
206
- context 'when setting value to empty string' do
207
- subject(:country) { updated_persisted_invoice.country }
208
-
209
- let(:updated_persisted_invoice) do
210
- VCR.use_cassette("#{vcr_dir}/save_old_with_empty_country") do
211
- repository.save(persisted_invoice.update(country: ''))
212
- end
213
- end
214
-
215
- it 'does not reset the country' do
216
- expect(country).to eq('SE')
217
- end
218
- end
219
- end
220
- end
221
-
222
- describe 'limits for invoice_row' do
223
- let(:invoice_attributes) { { customer_number: '1', invoice_rows: invoice_rows } }
224
- let(:model) { described_class::MODEL.new(invoice_attributes) }
225
- let(:invoice) { VCR.use_cassette("#{vcr_dir}/#{cassette}") { repository.save(model) } }
226
-
227
- describe 'description' do
228
- let(:cassette) { 'row_description_limit' }
229
- let(:invoice_rows) do
230
- [
231
- {
232
- article_number: '101',
233
- description: 'a' * 255
234
- }
235
- ]
236
- end
237
-
238
- it 'allows 255 characters' do
239
- expect(invoice.invoice_rows.first.description).to eq('a' * 255)
240
- end
241
- end
242
-
243
- describe 'delivered_quantity' do
244
- let(:cassette) { 'row_delivered_quantity_decimals' }
245
- let(:invoice_rows) do
246
- [
247
- {
248
- article_number: '101',
249
- description: 'Test',
250
- delivered_quantity: delivered_quantity
251
- }
252
- ]
253
- end
254
- let(:delivered_quantity) { 1.123 }
255
-
256
- it 'rounds to two decimals' do
257
- expect(invoice.invoice_rows.first.delivered_quantity).to eq 1.12
258
- end
259
-
260
- context 'when third decimal is 5' do
261
- let(:cassette) { 'row_delivered_quantity_decimals_round_up' }
262
- let(:delivered_quantity) { 1.125 }
263
-
264
- it 'rounds up' do
265
- expect(invoice.invoice_rows.first.delivered_quantity).to eq 1.13
266
- end
267
- end
268
- end
269
-
270
- describe 'price' do
271
- let(:cassette) { 'row_price_limit' }
272
- let(:invoice_rows) do
273
- [
274
- {
275
- article_number: '101',
276
- description: 'Test',
277
- price: price
278
- }
279
- ]
280
- end
281
- let(:price) { 1.123 }
282
-
283
- it 'rounds to two decimals' do
284
- expect(invoice.invoice_rows.first.price).to eq 1.12
285
- end
286
-
287
- context 'when third decimal is 5' do
288
- let(:cassette) { 'row_price_limit_round_up' }
289
- let(:price) { 1.125 }
290
-
291
- it 'rounds up' do
292
- expect(invoice.invoice_rows.first.price).to eq 1.13
293
- end
294
- end
295
- end
296
- end
297
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api'
5
- require 'fortnox/api/mappers'
6
- require 'fortnox/api/repositories/order'
7
- require 'fortnox/api/repositories/examples/all'
8
- require 'fortnox/api/repositories/examples/find'
9
- require 'fortnox/api/repositories/examples/only'
10
- require 'fortnox/api/repositories/examples/save'
11
- require 'fortnox/api/repositories/examples/save_with_nested_model'
12
- require 'fortnox/api/repositories/examples/search'
13
-
14
- describe Fortnox::API::Repository::Order, integration: true, order: :defined do
15
- include Helpers::Configuration
16
- include Helpers::Repositories
17
-
18
- subject(:repository) { described_class.new }
19
-
20
- before { set_api_test_configuration }
21
-
22
- required_hash = { customer_number: '1' }
23
-
24
- include_examples '.save', :comments, additional_attrs: required_hash
25
-
26
- nested_model_hash = { price: -9_999_999_999, article_number: '101', ordered_quantity: 1 }
27
- include_examples '.save with nested model',
28
- required_hash,
29
- :order_rows,
30
- nested_model_hash,
31
- [Fortnox::API::Types::OrderRow.new(nested_model_hash)]
32
-
33
- # VCR: Update expected result
34
- include_examples '.all', 7
35
-
36
- # VCR: Searched Orders needs to be created manually in Fortnox
37
- include_examples '.find', 1 do
38
- let(:find_by_hash_failure) { { ourreference: 'Not found' } }
39
-
40
- let(:single_param_find_by_hash) do
41
- { find_hash: { ourreference: 'Belladonna Took' }, matches: 2 }
42
- end
43
- let(:multi_param_find_by_hash) do
44
- { find_hash: { ourreference: 'Belladonna Took', yourreference: 'Bodo Proudfoot' },
45
- matches: 1 }
46
- end
47
- end
48
-
49
- # VCR: Searched Order needs to be created manually
50
- include_examples '.search', :customername, 'A customer', 1
51
-
52
- include_examples '.only', :cancelled, 2
53
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api'
5
- require 'fortnox/api/mappers'
6
- require 'fortnox/api/repositories/project'
7
- require 'fortnox/api/repositories/examples/all'
8
- require 'fortnox/api/repositories/examples/find'
9
- require 'fortnox/api/repositories/examples/save'
10
-
11
- describe Fortnox::API::Repository::Project, integration: true, order: :defined do
12
- include Helpers::Configuration
13
- include Helpers::Repositories
14
-
15
- subject(:repository) { described_class.new }
16
-
17
- before { set_api_test_configuration }
18
-
19
- include_examples '.save',
20
- :comments,
21
- additional_attrs: { description: 'Some important project' }
22
-
23
- # VCR: It is not yet possible to delete Projects. Therefore, expected nr of
24
- # Projects when running .all will continue to increase
25
- # (until 100, which is max by default).
26
- include_examples '.all', 2
27
-
28
- include_examples '.find', '1' do
29
- let(:find_by_hash_failure) { { offset: 10_000 } }
30
- let(:single_param_find_by_hash) { { find_hash: { limit: 1 }, matches: 1 } }
31
-
32
- let(:multi_param_find_by_hash) do
33
- { find_hash: { limit: 2, offset: 0 }, matches: 2 }
34
- end
35
- end
36
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api'
5
- require 'fortnox/api/mappers'
6
- require 'fortnox/api/repositories/terms_of_payment'
7
- require 'fortnox/api/repositories/examples/all'
8
- require 'fortnox/api/repositories/examples/find'
9
- require 'fortnox/api/repositories/examples/save'
10
- require 'fortnox/api/repositories/examples/save_with_specially_named_attribute'
11
- require 'fortnox/api/repositories/examples/search'
12
-
13
- describe Fortnox::API::Repository::TermsOfPayment, integration: true, order: :defined do
14
- include Helpers::Configuration
15
- include Helpers::Repositories
16
-
17
- subject(:repository) { described_class.new }
18
-
19
- before { set_api_test_configuration }
20
-
21
- # VCR: code must be changed to a new unique one
22
- required_hash = { code: '21DAYS' }
23
-
24
- include_examples '.save', :description, additional_attrs: required_hash
25
-
26
- # VCR: expected matches needs to be increased
27
- include_examples '.all', 10
28
-
29
- # VCR: The terms of payment searched here needs to be created manually in Fortnox
30
- include_examples '.find', '19DAYS', find_by_hash: false do
31
- let(:find_by_hash_failure) { { code: '19days' } }
32
- let(:single_param_find_by_hash) { { find_hash: { code: '30days' }, matches: 1 } }
33
- end
34
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api'
5
- require 'fortnox/api/mappers'
6
- require 'fortnox/api/repositories/unit'
7
- require 'fortnox/api/repositories/examples/all'
8
- require 'fortnox/api/repositories/examples/find'
9
- require 'fortnox/api/repositories/examples/save'
10
- require 'fortnox/api/repositories/examples/save_with_specially_named_attribute'
11
-
12
- describe Fortnox::API::Repository::Unit, integration: true, order: :defined do
13
- include Helpers::Configuration
14
- include Helpers::Repositories
15
-
16
- subject(:repository) { described_class.new }
17
-
18
- before { set_api_test_configuration }
19
-
20
- # VCR: code needs to be changed to a unique value
21
- include_examples '.save',
22
- :description,
23
- additional_attrs: { code: 'blarg9' }
24
-
25
- # VCR: code needs to be changed to a unique value
26
- include_examples '.save with specially named attribute',
27
- { description: 'Happy clouds' },
28
- :code,
29
- 'woooh7'
30
-
31
- # VCR: expected number must be updated
32
- include_examples '.all', 7
33
-
34
- # VCR: code must be updated
35
- include_examples '.find', 'blarg7', find_by_hash: false do
36
- let(:find_by_hash_failure) { { code: 'notfound' } }
37
- let(:single_param_find_by_hash) { { find_hash: { code: 'blarg7' }, matches: 1 } }
38
- end
39
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types'
5
- require 'fortnox/api/types/examples/types'
6
-
7
- describe Fortnox::API::Types do
8
- let(:klass) { Fortnox::API::Types::AccountNumber }
9
-
10
- describe 'AccountNumber' do
11
- context 'when created with nil' do
12
- subject { klass[nil] }
13
-
14
- it { is_expected.to be_nil }
15
- end
16
-
17
- context 'when created with empty string' do
18
- subject { klass[''] }
19
-
20
- it { is_expected.to be_nil }
21
- end
22
-
23
- context 'when created with valid number' do
24
- include_examples 'equals input', 1234
25
- end
26
-
27
- context 'when created with a too large number' do
28
- include_examples 'raises ConstraintError', 10_000
29
- end
30
-
31
- context 'when created with a negative number' do
32
- include_examples 'raises ConstraintError', -1
33
- end
34
- end
35
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types'
5
-
6
- describe Fortnox::API::Types::CountryCode do
7
- context 'with nil' do
8
- subject { described_class[nil] }
9
-
10
- it { is_expected.to be_nil }
11
- end
12
-
13
- context 'with empty string' do
14
- subject { described_class[''] }
15
-
16
- it { is_expected.to eq('') }
17
- end
18
-
19
- context 'with valid input' do
20
- it 'accepts country codes' do
21
- expect(described_class['NO']).to eq 'NO'
22
- end
23
- end
24
-
25
- context 'with invalid input' do
26
- describe 'valid country name' do
27
- it do
28
- expect do
29
- described_class['Norway']
30
- end.to raise_error(Dry::Types::ConstraintError)
31
- end
32
- end
33
-
34
- describe 'invalid country code' do
35
- it do
36
- expect do
37
- described_class['XX']
38
- end.to raise_error(Dry::Types::ConstraintError)
39
- end
40
- end
41
- end
42
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types'
5
-
6
- describe Fortnox::API::Types::Country do
7
- context 'with nil' do
8
- subject { described_class[nil] }
9
-
10
- it { is_expected.to be_nil }
11
- end
12
-
13
- context 'with empty string' do
14
- subject { described_class[''] }
15
-
16
- it { is_expected.to eq('') }
17
- end
18
-
19
- context 'with valid input' do
20
- it 'accepts country codes' do
21
- expect(described_class['NO']).to eq 'NO'
22
- end
23
-
24
- it 'translates English country names to country code' do
25
- expect(described_class['Norway']).to eq 'NO'
26
- end
27
-
28
- it 'translates Swedish country names to country code' do
29
- expect(described_class['Norge']).to eq 'NO'
30
- end
31
-
32
- describe 'special cases' do
33
- valid_sweden_inputs = [
34
- 'SE', 'se', 'Sweden', 'sweden', 'Sverige', 'sverige',
35
- :SE, :se, :Sweden, :sweden, :Sverige, :sverige
36
- ].freeze
37
-
38
- valid_sweden_inputs.each do |sweden_input|
39
- it "converts \"#{sweden_input}\" to \"SE\"" do
40
- expect(described_class[sweden_input]).to eq 'SE'
41
- end
42
- end
43
-
44
- it 'accepts country code for El Salvador' do
45
- expect(described_class['SV']).to eq 'SV'
46
- end
47
-
48
- it 'translated Switzerland to' do
49
- expect(described_class['Switzerland']).to eq 'CH'
50
- end
51
- end
52
- end
53
-
54
- context 'with invalid input' do
55
- invalid_inputs = [
56
- 'SEA', 'S', 'nonsense', :s
57
- ].freeze
58
-
59
- invalid_inputs.each do |invalid_input|
60
- it "#{invalid_input} raises Dry::Types::ConstraintError" do
61
- expect do
62
- described_class[invalid_input]
63
- end.to raise_error(Dry::Types::ConstraintError)
64
- end
65
- end
66
- end
67
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types/default_delivery_types'
5
-
6
- RSpec.describe Fortnox::API::Types::DefaultDeliveryTypes, type: :type do
7
- subject { described_class }
8
-
9
- it { is_expected.to have_default_delivery_type(:invoice) }
10
- it { is_expected.to have_default_delivery_type(:order) }
11
- it { is_expected.to have_default_delivery_type(:offer) }
12
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types/edi_information'
5
-
6
- RSpec.describe Fortnox::API::Types::EDIInformation, type: :type do
7
- subject { described_class }
8
-
9
- it { is_expected.to have_nullable_string(:edi_global_location_number) }
10
- it { is_expected.to have_nullable_string(:edi_global_location_number_delivery) }
11
- it { is_expected.to have_nullable_string(:edi_invoice_extra1) }
12
- it { is_expected.to have_nullable_string(:edi_invoice_extra2) }
13
- it { is_expected.to have_nullable_string(:edi_our_electronic_reference) }
14
- it { is_expected.to have_nullable_string(:edi_your_electronic_reference) }
15
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types/email_information'
5
-
6
- RSpec.describe Fortnox::API::Types::EmailInformation, type: :type do
7
- subject { described_class }
8
-
9
- it { is_expected.to have_email(:email_address_to) }
10
- it { is_expected.to have_email(:email_address_cc) }
11
- it { is_expected.to have_email(:email_address_bcc) }
12
-
13
- it { is_expected.to have_sized_string(:email_subject, 100) }
14
- it { is_expected.to have_sized_string(:email_body, 20_000) }
15
- end