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,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api'
5
-
6
- describe Fortnox::API do
7
- before { stub_const('Fortnox::API::TestBase', Class.new) }
8
-
9
- describe 'configuration defaults' do
10
- subject(:config_value) { described_class.config[config_key] }
11
-
12
- before { Fortnox::API::TestBase.new }
13
-
14
- describe 'base_url' do
15
- let(:config_key) { :base_url }
16
-
17
- it { is_expected.to eq 'https://api.fortnox.se/3/' }
18
- end
19
-
20
- describe 'token_url' do
21
- let(:config_key) { :token_url }
22
-
23
- it { is_expected.to eq 'https://apps.fortnox.se/oauth-v1/token' }
24
- end
25
-
26
- describe 'logger' do
27
- let(:config_key) { :logger }
28
-
29
- it { is_expected.to be_a Logger }
30
-
31
- describe 'level' do
32
- subject { config_value.level }
33
-
34
- it { is_expected.to be Logger::WARN }
35
- end
36
- end
37
- end
38
-
39
- describe 'readers for' do
40
- describe 'debugging' do
41
- subject(:debugging) { described_class.debugging }
42
-
43
- it 'is available' do
44
- expect(debugging).to be false
45
- end
46
- end
47
-
48
- describe 'logger' do
49
- subject(:logger) { described_class.logger }
50
-
51
- it 'is available' do
52
- expect(logger).to be_a Logger
53
- end
54
- end
55
- end
56
-
57
- describe '#access_token' do
58
- context 'when token is set' do
59
- before { described_class.access_token = 'an_access_token' }
60
-
61
- it 'returns the token' do
62
- expect(described_class.access_token).to eq('an_access_token')
63
- end
64
- end
65
- end
66
- end
data/spec/spec_helper.rb DELETED
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ENV['RUBY_ENV'] = 'test'
4
-
5
- require 'simplecov'
6
-
7
- SimpleCov.start
8
-
9
- require 'rspec/collection_matchers'
10
- require 'webmock/rspec'
11
- require 'pry'
12
- require 'support/matchers'
13
- require 'support/helpers'
14
- require 'support/vcr_setup'
15
-
16
- RSpec.configure do |config|
17
- config.run_all_when_everything_filtered = true
18
- config.filter_run :focus
19
-
20
- config.extend Helpers # Allow access to helpers in describe and context blocks
21
- config.include Helpers # Allow access to helpers in it and let blocks
22
-
23
- config.include Matchers::Type, type: :type
24
-
25
- config.order = 'random'
26
-
27
- WebMock.disable_net_connect!(allow: 'codeclimate.com')
28
-
29
- # Reset configuration after each test run
30
- config.after do
31
- Fortnox::API::DEFAULT_CONFIGURATION.each do |key, value|
32
- Fortnox::API.config.send("#{key}=", value)
33
- end
34
- end
35
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dotenv'
4
- require 'jwt'
5
-
6
- DOTENV_FILE_NAME = '.env.test'
7
- Dotenv.load(DOTENV_FILE_NAME)
8
-
9
- DEBUG = ENV.fetch('DEBUG', false) == true
10
-
11
- module Helpers
12
- module Configuration
13
- def set_api_test_configuration # rubocop:disable Metrics/MethodLength
14
- Fortnox::API.configure do |config|
15
- config.debugging = DEBUG
16
-
17
- if DEBUG
18
- config.logger = lambda {
19
- logger = Logger.new($stdout)
20
- logger.level = Logger::DEBUG
21
- return logger
22
- }.call
23
- end
24
- end
25
-
26
- Fortnox::API.access_token = ENV.fetch('FORTNOX_API_ACCESS_TOKEN')
27
- end
28
-
29
- def add_to_registry(symbol, klass)
30
- unless Fortnox::API::Registry.key? symbol
31
- # Only register the key once...
32
- Fortnox::API::Registry.register(symbol) { klass }
33
- end
34
-
35
- # ... but stub the value each test run
36
- Fortnox::API::Registry.stub(symbol, klass)
37
- end
38
- end
39
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Helpers
4
- module Repositories
5
- # Returns directory for VCR.
6
- def vcr_dir
7
- described_class::MAPPER::JSON_COLLECTION_WRAPPER.downcase
8
- end
9
- end
10
- end
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Dir[File.expand_path('spec/support/helpers/*.rb')].sort.each { |file| require file }
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- class AttributeMatcher
6
- def initialize(attribute, valid_hash, attribute_type)
7
- @attribute = attribute
8
- @valid_hash = valid_hash.dup
9
- @attribute_type = attribute_type
10
- @errors = ''
11
- end
12
-
13
- def matches?(klass)
14
- @klass = klass
15
- end
16
-
17
- def description
18
- "have #{@attribute_type} attribute #{@attribute.inspect}"
19
- end
20
-
21
- def failure_message
22
- "Expected class to have attribute #{@attribute.inspect} defined as #{@attribute_type}, " \
23
- "but got following errors:
24
- #{@errors}"
25
- end
26
-
27
- protected
28
-
29
- def expect_error(msg)
30
- yield
31
-
32
- @errors = @errors += msg
33
- false # Fail test since expected error not thrown
34
- rescue Dry::Struct::Error
35
- # TODO: check if error message is correct
36
- true
37
- end
38
- end
39
- end
40
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- class EnumMatcher < TypeMatcher
6
- def initialize(attribute, valid_hash, enum_type, enum_types, nonsense_value: 'NONSENSE')
7
- valid_value = Fortnox::API::Types.const_get(enum_types).values.first
8
-
9
- super(attribute, valid_hash, enum_type, valid_value, nonsense_value)
10
-
11
- @enum_type = Fortnox::API::Types.const_get(enum_type)
12
- @expected_error = "Exception missing for nonsense value #{@invalid_value.inspect}"
13
- end
14
-
15
- private
16
-
17
- def expected_type?
18
- @actual_type = @klass.schema.keys.find { |x| x.name == @attribute }&.type
19
- @actual_type == @enum_type
20
- end
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_account_number(attribute, valid_hash = {})
6
- HaveAccountNumberMatcher.new(attribute, valid_hash)
7
- end
8
-
9
- class HaveAccountNumberMatcher < TypeMatcher
10
- def initialize(attribute, valid_hash)
11
- super(attribute, valid_hash, 'account number', 1000, -1)
12
- @expected_error = "Exception missing for invalid value #{@invalid_value.inspect}"
13
- end
14
-
15
- private
16
-
17
- def expected_type?
18
- @actual_type = @klass.schema.keys.find { |x| x.name == @attribute }&.type
19
- @actual_type == Fortnox::API::Types::AccountNumber
20
- end
21
- end
22
- end
23
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_currency(attribute, valid_hash = {})
6
- EnumMatcher.new(attribute, valid_hash, 'Currency', 'Currencies')
7
- end
8
- end
9
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_customer_type(attribute, valid_hash = {})
6
- HaveCustomerTypeMatcher.new(attribute, valid_hash)
7
- end
8
-
9
- class HaveCustomerTypeMatcher < EnumMatcher
10
- def initialize(attribute, valid_hash)
11
- super(attribute, valid_hash, 'CustomerType', 'CustomerTypes')
12
- end
13
- end
14
- end
15
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_default_delivery_type(attribute, valid_hash = {})
6
- EnumMatcher.new(attribute, valid_hash, 'DefaultDeliveryType', 'DefaultDeliveryTypeValues')
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_discount_type(attribute, valid_hash = {})
6
- EnumMatcher.new(attribute, valid_hash, 'DiscountType', 'DiscountTypes')
7
- end
8
- end
9
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_email(attribute, valid_hash = {})
6
- HaveEmailMatcher.new(attribute, valid_hash)
7
- end
8
-
9
- class HaveEmailMatcher < TypeMatcher
10
- def initialize(attribute, valid_hash)
11
- super(attribute, valid_hash, 'email', 'valid@email.com', 'invalid@email_without_top_domain')
12
- @expected_error = "Exception missing for invalid value #{@invalid_value.inspect}"
13
- @expected_type = Fortnox::API::Types::Email
14
- end
15
-
16
- private
17
-
18
- def expected_type?
19
- @actual_type = @klass.schema.keys.find { |x| x.name == @attribute }&.type
20
- @actual_type == Fortnox::API::Types::Email
21
- end
22
- end
23
- end
24
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_housework_type(attribute, valid_hash = {})
6
- EnumMatcher.new(attribute, valid_hash, 'HouseworkType', 'HouseworkTypes')
7
- end
8
- end
9
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_nullable_date(attribute, valid_value, invalid_value)
6
- HaveNullableDateMatcher.new(attribute, valid_value, invalid_value)
7
- end
8
-
9
- class HaveNullableDateMatcher < HaveNullableMatcher
10
- def initialize(attribute, valid_value, invalid_value)
11
- @attribute = attribute
12
- @valid_value = valid_value
13
- @invalid_value = invalid_value
14
- @expected_error = Fortnox::API::AttributeError
15
- @expected_error_message = 'invalid date'
16
- @failure_description = ''
17
-
18
- super(attribute, valid_value, invalid_value, nil)
19
- end
20
-
21
- def matches?(klass)
22
- @klass = klass
23
-
24
- accepts_nil? && accepts_valid_value? && rejects_invalid_value?
25
- end
26
-
27
- def description
28
- "have nullable attribute #{@attribute.inspect}"
29
- end
30
-
31
- def failure_message
32
- "Expected class to have nullable attribute #{@attribute.inspect}" << @failure_description
33
- end
34
-
35
- private
36
-
37
- def accepts_nil?
38
- @klass.new(@attribute => nil)
39
- end
40
-
41
- def accepts_valid_value?
42
- model = @klass.new(@attribute => @valid_value)
43
- model.send(@attribute) == @valid_value
44
- end
45
-
46
- def rejects_invalid_value?
47
- @klass.new(@attribute => @invalid_value)
48
-
49
- @failure_description << " (Expected #{@expected_error}, but got none)"
50
- false
51
- rescue @expected_error => exception
52
- return true if exception.message == @expected_error_message
53
-
54
- fail_message = "Expected error message to include #{@expected_error_message.inspect}, " \
55
- "but was #{exception.message.inspect}"
56
- raise(fail_message)
57
- end
58
- end
59
- end
60
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_nullable(attribute, valid_value, invalid_value, default_value)
6
- HaveNullableMatcher.new(attribute, valid_value, invalid_value, default_value)
7
- end
8
-
9
- class HaveNullableMatcher
10
- def initialize(attribute, valid_value, invalid_value, default_value)
11
- @attribute = attribute
12
- @valid_value = valid_value
13
- @invalid_value = invalid_value
14
- @default_value = default_value
15
- @failure_description = ''
16
- end
17
-
18
- def matches?(klass)
19
- @klass = klass
20
-
21
- accepts_nil? && accepts_valid_value? && defaults_invalid_value?
22
- end
23
-
24
- def description
25
- "have nullable attribute #{@attribute.inspect}"
26
- end
27
-
28
- def failure_message
29
- "Expected class to have nullable attribute #{@attribute.inspect}" << @failure_description
30
- end
31
-
32
- private
33
-
34
- def accepts_nil?
35
- @klass.new(@attribute => nil)
36
- end
37
-
38
- def accepts_valid_value?
39
- model = @klass.new(@attribute => @valid_value)
40
- model.send(@attribute) == @valid_value
41
- end
42
-
43
- def defaults_invalid_value?
44
- model = @klass.new(@attribute => @invalid_value)
45
- value = model.send(@attribute)
46
- return true if value == @default_value
47
-
48
- @failure_description << " (Expected #{@invalid_value.inspect} to default to " \
49
- "#{@default_value.inspect}), but got #{value.inspect}"
50
- false
51
- end
52
- end
53
- end
54
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_nullable_string(attribute, valid_hash = {})
6
- HaveNullableStringMatcher.new(attribute, valid_hash)
7
- end
8
-
9
- class HaveNullableStringMatcher < AttributeMatcher
10
- def initialize(attribute, valid_hash)
11
- super(attribute, valid_hash, 'nullable string')
12
- end
13
-
14
- def matches?(klass)
15
- super
16
-
17
- accepts_nil? && accepts_string? && rejects_non_string?
18
- end
19
-
20
- private
21
-
22
- def accepts_nil?
23
- model = @klass.new(@valid_hash.merge(@attribute => nil))
24
- model.send(@attribute).nil?
25
- end
26
-
27
- def accepts_string?
28
- valid_string = 'A string'
29
- model = @klass.new(@valid_hash.merge(@attribute => valid_string))
30
- model.send(@attribute) == 'A string'
31
- end
32
-
33
- def rejects_non_string?
34
- non_string = 10.0
35
- @klass.new(@valid_hash.merge(@attribute => non_string))
36
- rescue Fortnox::API::AttributeError => exception
37
- expected_message = "#{non_string.inspect} (#{non_string.class}) " \
38
- "has invalid type for #{@attribute.inspect}"
39
- return true if exception.message.include?(expected_message)
40
-
41
- fail_message = "Expected error message to include #{expected_message.inspect}, " \
42
- "but was #{exception.message.inspect}"
43
- raise(fail_message)
44
- end
45
- end
46
- end
47
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_sized_float(attribute, min_value, max_value, valid_hash = {})
6
- options = { min_value: min_value, max_value: max_value, step: 0.1 }
7
- NumericMatcher.new(attribute, valid_hash, 'sized float', options)
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_sized_integer(attribute, min_value, max_value, valid_hash = {})
6
- options = { min_value: min_value, max_value: max_value, step: 1 }
7
- NumericMatcher.new(attribute, valid_hash, 'sized integer', options)
8
- end
9
- end
10
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_sized_string(attribute, max_size, valid_hash = {})
6
- HaveSizedStringMatcher.new(attribute, max_size, valid_hash)
7
- end
8
-
9
- class HaveSizedStringMatcher < AttributeMatcher
10
- def initialize(attribute, max_size, valid_hash)
11
- super(attribute, valid_hash, 'sized string')
12
- @max_size = max_size
13
- end
14
-
15
- def matches?(klass)
16
- @klass = klass
17
-
18
- accepts_max_size? && rejects_too_long_string?
19
- end
20
-
21
- private
22
-
23
- def accepts_max_size?
24
- @klass.new(@valid_hash.merge(@attribute => 'a' * @max_size))
25
- end
26
-
27
- def rejects_too_long_string?
28
- too_long = @max_size + 1
29
- too_long_string = 'a' * too_long
30
- expect_error("Exception missing for too long string (#{too_long} characters)") do
31
- @klass.new(@valid_hash.merge(@attribute => too_long_string))
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- def have_vat_type(attribute, valid_hash = {})
6
- EnumMatcher.new(attribute, valid_hash, 'VATType', 'VATTypes')
7
- end
8
- end
9
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Matchers
4
- module Type
5
- class NumericMatcher < AttributeMatcher
6
- def initialize(attribute, valid_hash, attr_type, options)
7
- super(attribute, valid_hash, attr_type)
8
-
9
- @min_value = options[:min_value]
10
- @max_value = options[:max_value]
11
- @step = options[:step]
12
- end
13
-
14
- def matches?(klass)
15
- super
16
-
17
- rejects_too_small_value? &&
18
- accepts_min_value? &&
19
- accepts_max_value? &&
20
- rejects_too_big_value?
21
- end
22
-
23
- private
24
-
25
- def rejects_too_small_value?
26
- too_small_value = @min_value - @step
27
- expected_error_message = "Exception missing for too small value (#{too_small_value})"
28
- rejects_value?(too_small_value, expected_error_message)
29
- end
30
-
31
- def accepts_min_value?
32
- @klass.new(@valid_hash.merge(@attribute => @min_value))
33
- end
34
-
35
- def accepts_max_value?
36
- @klass.new(@valid_hash.merge(@attribute => @max_value))
37
- end
38
-
39
- def rejects_too_big_value?
40
- too_big_value = @max_value + @step
41
- expected_error_message = "Exception missing for too big value (#{too_big_value})"
42
- rejects_value?(too_big_value, expected_error_message)
43
- end
44
-
45
- def rejects_value?(value, expected_error_message)
46
- expect_error(expected_error_message) do
47
- @klass.new(@valid_hash.merge(@attribute => value))
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'fortnox/api'
4
-
5
- module Matchers
6
- module Type
7
- def require_attribute(attribute, valid_hash = {})
8
- RequireAttributeMatcher.new(attribute, valid_hash)
9
- end
10
-
11
- class RequireAttributeMatcher
12
- EXCEPTION = Fortnox::API::MissingAttributeError
13
-
14
- def initialize(attribute, valid_hash)
15
- @attribute = attribute
16
- @invalid_hash = valid_hash.dup.tap { |hash| hash.delete(attribute) }
17
- end
18
-
19
- def matches?(klass)
20
- @klass = klass
21
-
22
- raise_error && includes_error_message
23
- end
24
-
25
- def failure_message
26
- return no_exception_failure_message unless raise_error
27
- return wrong_error_message unless includes_error_message
28
- end
29
-
30
- def description
31
- "require attribute #{@attribute.inspect}"
32
- end
33
-
34
- private
35
-
36
- def raise_error
37
- @klass.new(@invalid_hash)
38
-
39
- false # Fail test since expected error is not thrown
40
- rescue EXCEPTION
41
- true
42
- end
43
-
44
- def includes_error_message
45
- @klass.new(@invalid_hash)
46
- rescue EXCEPTION => exception
47
- return true if exception.message.include? expected_error_message
48
-
49
- @wrong_error_message = exception.message
50
- false
51
- end
52
-
53
- def expected_error_message
54
- @attribute.to_s
55
- end
56
-
57
- def no_exception_failure_message
58
- "Expected class to raise #{EXCEPTION} " \
59
- "when attribute #{@attribute.inspect} is missing."
60
- end
61
-
62
- def wrong_error_message
63
- "Expected exception to equal #{expected_error_message.inspect}. " \
64
- "Message was #{@wrong_error_message.inspect}."
65
- end
66
- end
67
- end
68
- end