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,56 +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::Email do
8
- let(:klass) { described_class }
9
-
10
- context 'when created with nil' do
11
- subject { described_class[nil] }
12
-
13
- it { is_expected.to be_nil }
14
- end
15
-
16
- context 'when created with empty string' do
17
- subject { described_class[''] }
18
-
19
- it { is_expected.to eq('') }
20
- end
21
-
22
- context 'when created with valid email' do
23
- valid_emails = [
24
- 'valid@example.com',
25
- 'kanal_75_ab-faktura@mail.unit4agresso.readsoftonline.com',
26
- 'sköldpadda@example.com',
27
- 'user@teståäö.se'
28
- ]
29
-
30
- valid_emails.each do |email|
31
- it { expect(described_class[email]).to eq email }
32
- end
33
- end
34
-
35
- context 'when created with invalid email' do
36
- invalid_emails = [
37
- 'te$£@st@example.com',
38
- 'user@exam!ple.com',
39
- 'user@exam<ple.com',
40
- 'user@exam>ple.com',
41
- 'user@exam=ple.com',
42
- 'user@exam[ple.com',
43
- 'user@exam]ple.com'
44
- ]
45
-
46
- invalid_emails.each do |email|
47
- include_examples 'raises ConstraintError', email
48
- end
49
- end
50
-
51
- context 'when created with more than 1024 characters' do
52
- legal_characters = 'abcdefghijklmnopqrstuvwxyz0123456789.-_+'.chars
53
- too_long_email = "#{(legal_characters * 35).shuffle.join}@example.com"
54
- include_examples 'raises ConstraintError', too_long_email
55
- end
56
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types'
5
- require 'fortnox/api/types/examples/enum'
6
-
7
- describe Fortnox::API::Types do
8
- it_behaves_like 'enum', 'ArticleType', 'ArticleTypes'
9
- it_behaves_like 'enum', 'Currency', 'Currencies', auto_crop: true
10
- it_behaves_like 'enum', 'CustomerType', 'CustomerTypes'
11
- it_behaves_like 'enum', 'DiscountType', 'DiscountTypes'
12
- it_behaves_like 'enum', 'HouseworkType', 'HouseworkTypes'
13
- it_behaves_like 'enum', 'VATType', 'VATTypes'
14
- it_behaves_like 'enum', 'DefaultDeliveryType', 'DefaultDeliveryTypeValues'
15
- it_behaves_like 'enum', 'ProjectStatusType', 'ProjectStatusTypes'
16
- it_behaves_like 'enum', 'TaxReductionType', 'TaxReductionTypes'
17
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_examples_for 'DocumentRow' do |valid_hash|
4
- it { is_expected.to have_account_number(:account_number, valid_hash) }
5
-
6
- it { is_expected.to have_sized_string(:article_number, 50, valid_hash) }
7
- it { is_expected.to have_sized_string(:description, 255, valid_hash) }
8
-
9
- it { is_expected.to have_discount_type(:discount_type, valid_hash) }
10
-
11
- it { is_expected.to have_sized_integer(:housework_hours_to_report, 0, 99_999, valid_hash) }
12
-
13
- it { is_expected.to have_housework_type(:housework_type, valid_hash) }
14
-
15
- it { is_expected.to have_sized_float(:price, -9_999_999_999, 99_999_999_999.9, valid_hash) }
16
-
17
- it do # rubocop:disable RSpec/ExampleLength
18
- expect(subject).to have_sized_float(
19
- :delivered_quantity,
20
- -9_999_999_999_999.9,
21
- 9_999_999_999_999.9,
22
- valid_hash
23
- )
24
- end
25
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'fortnox/api/types/examples/types'
4
-
5
- shared_examples_for 'enum' do |name, values, auto_crop: false|
6
- describe name do
7
- let(:klass) { Fortnox::API::Types.const_get(name) }
8
-
9
- context 'when created with nil' do
10
- subject { klass[nil] }
11
-
12
- it { is_expected.to be_nil }
13
- end
14
-
15
- context 'when created' do
16
- subject { klass[input] }
17
-
18
- let(:enum_value) { Fortnox::API::Types.const_get(values).values.sample }
19
-
20
- context 'with a random member from then enum' do
21
- let(:input) { enum_value }
22
-
23
- it { is_expected.to eq enum_value }
24
- end
25
-
26
- context 'with a symoblised, random member from the enum' do
27
- let(:input) { enum_value.to_sym }
28
-
29
- it { is_expected.to eq enum_value }
30
- end
31
-
32
- context 'with a lower case, random member from the enum' do
33
- let(:input) { enum_value.downcase }
34
-
35
- it { is_expected.to eq enum_value }
36
- end
37
-
38
- context 'with a string that starts like a random member from the enum' do
39
- let(:input) { "#{enum_value.downcase}more string" }
40
-
41
- if auto_crop
42
- it { is_expected.to eq enum_value }
43
- else
44
- it do
45
- expect { klass[input] }.to raise_error(Dry::Types::ConstraintError)
46
- end
47
- end
48
- end
49
- end
50
-
51
- context 'when created with invalid input' do
52
- include_examples 'raises ConstraintError', 'r4nd0m'
53
- end
54
- end
55
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_examples_for 'equals input' do |input|
4
- subject { klass[input] }
5
-
6
- it { is_expected.to eq input }
7
- end
8
-
9
- shared_examples_for 'raises ConstraintError' do |input|
10
- specify { expect { klass[input] }.to raise_error(Dry::Types::ConstraintError) }
11
- end
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api'
5
- require 'fortnox/api/types'
6
- require 'fortnox/api/repositories/order'
7
- require 'fortnox/api/models/order'
8
- require 'fortnox/api/types/order_row'
9
-
10
- describe 'HouseworkTypes', integration: true do
11
- include Helpers::Configuration
12
- include Helpers::Repositories
13
-
14
- before do
15
- set_api_test_configuration
16
- stub_const('TYPE_ROT', Fortnox::API::Types::TaxReductionTypes['rot'])
17
- stub_const('TYPE_RUT', Fortnox::API::Types::TaxReductionTypes['rut'])
18
- end
19
-
20
- let(:repository) { Fortnox::API::Repository::Order.new }
21
-
22
- shared_examples_for 'housework type' do |type, tax_reduction_type, legacy: false, housework: true|
23
- let(:document) do
24
- Fortnox::API::Model::Order.new(
25
- customer_number: '1',
26
- tax_reduction_type: Object.const_get(tax_reduction_type),
27
- order_rows: [
28
- Fortnox::API::Types::OrderRow.new(
29
- ordered_quantity: 1,
30
- article_number: '101',
31
- housework_type: Fortnox::API::Types::HouseworkTypes[type],
32
- housework: housework
33
- )
34
- ]
35
- )
36
- end
37
- let(:save) do
38
- -> { VCR.use_cassette("orders/housework_type_#{type.downcase}") { repository.save(document) } }
39
- end
40
-
41
- context "when creating an OrderRow with housework_type set to #{type}" do
42
- if legacy
43
- let(:error_message) { /Skattereduktion för den valda typen av husarbete har upphört/ }
44
-
45
- specify { expect { save.call }.to raise_error(Fortnox::API::RemoteServerError, error_message) }
46
- else
47
- specify { expect { save.call }.not_to raise_error }
48
- end
49
- end
50
- end
51
-
52
- it_behaves_like 'housework type', 'CONSTRUCTION', 'TYPE_ROT'
53
- it_behaves_like 'housework type', 'ELECTRICITY', 'TYPE_ROT'
54
- it_behaves_like 'housework type', 'GLASSMETALWORK', 'TYPE_ROT'
55
- it_behaves_like 'housework type', 'GROUNDDRAINAGEWORK', 'TYPE_ROT'
56
- it_behaves_like 'housework type', 'MASONRY', 'TYPE_ROT'
57
- it_behaves_like 'housework type', 'PAINTINGWALLPAPERING', 'TYPE_ROT'
58
- it_behaves_like 'housework type', 'HVAC', 'TYPE_ROT'
59
- it_behaves_like 'housework type', 'OTHERCOSTS', 'TYPE_ROT', housework: false
60
-
61
- it_behaves_like 'housework type', 'MAJORAPPLIANCEREPAIR', 'TYPE_RUT'
62
- it_behaves_like 'housework type', 'MOVINGSERVICES', 'TYPE_RUT'
63
- it_behaves_like 'housework type', 'ITSERVICES', 'TYPE_RUT'
64
- it_behaves_like 'housework type', 'CLEANING', 'TYPE_RUT'
65
- it_behaves_like 'housework type', 'TEXTILECLOTHING', 'TYPE_RUT'
66
- it_behaves_like 'housework type', 'SNOWPLOWING', 'TYPE_RUT'
67
- it_behaves_like 'housework type', 'GARDENING', 'TYPE_RUT'
68
- it_behaves_like 'housework type', 'BABYSITTING', 'TYPE_RUT'
69
- it_behaves_like 'housework type', 'OTHERCARE', 'TYPE_RUT'
70
- it_behaves_like 'housework type', 'OTHERCOSTS', 'TYPE_RUT', housework: false
71
-
72
- # rubocop:disable RSpec/RepeatedExample
73
- # rubocop:disable RSpec/RepeatedDescription
74
- it 'will soon be added' do
75
- pending 'todo'
76
- raise StandardError, 'Will be supported 2021-01-01'
77
- # it_behaves_like 'housework type', 'HOMEMAINTENANCE', TYPE_RUT
78
- # it_behaves_like 'housework type', 'FURNISHING', TYPE_RUT
79
- # it_behaves_like 'housework type', 'TRANSPORTATIONSERVICES', TYPE_RUT
80
- # it_behaves_like 'housework type', 'WASHINGANDCAREOFCLOTHING', TYPE_RUT
81
- end
82
-
83
- it 'will soon be added' do
84
- pending 'todo'
85
- raise StandardError, 'Will be supported 2021-01-01'
86
- # it_behaves_like 'housework type', 'SOLARCELLS', TYPE_GREEN
87
- # it_behaves_like 'housework type', 'STORAGESELFPRODUCEDELECTRICTY', TYPE_GREEN
88
- # it_behaves_like 'housework type', 'CHARGINGSTATIONELECTRICVEHICLE', TYPE_GREEN
89
- # it_behaves_like 'housework type', 'OTHERCOSTS', TYPE_GREEN
90
- end
91
- # rubocop:enable RSpec/RepeatedExample
92
- # rubocop:enable RSpec/RepeatedDescription
93
-
94
- it_behaves_like 'housework type', 'COOKING', 'TYPE_RUT', legacy: true
95
- it_behaves_like 'housework type', 'TUTORING', 'TYPE_RUT', legacy: true
96
-
97
- describe 'with OTHERCOSTS' do
98
- let(:document) do
99
- Fortnox::API::Model::Order.new(
100
- customer_number: '1',
101
- tax_reduction_type: TYPE_ROT,
102
- order_rows: [
103
- Fortnox::API::Types::OrderRow.new(
104
- ordered_quantity: 1,
105
- article_number: '101',
106
- housework_type: Fortnox::API::Types::HouseworkTypes['OTHERCOSTS'],
107
- housework: true
108
- )
109
- ]
110
- )
111
- end
112
-
113
- let(:error_message) { /Kan inte sätta typen övrig kostnad på en rad markerad som husarbete/ }
114
-
115
- it "can't have housework set to true" do
116
- expect do
117
- VCR.use_cassette('orders/housework_othercoses_invalid') { repository.save(document) }
118
- end.to raise_error(Fortnox::API::RemoteServerError, error_message)
119
- end
120
- end
121
-
122
- describe 'with wrong tax reduction type' do
123
- let(:type) { 'CONSTRUCTION' }
124
- let(:document) do
125
- Fortnox::API::Model::Order.new(
126
- customer_number: '1',
127
- tax_reduction_type: TYPE_RUT,
128
- order_rows: [
129
- Fortnox::API::Types::OrderRow.new(
130
- ordered_quantity: 1,
131
- article_number: '101',
132
- housework_type: Fortnox::API::Types::HouseworkTypes[type],
133
- housework: true
134
- )
135
- ]
136
- )
137
- end
138
-
139
- let(:error_message) do
140
- /Dokument med skattereduktionstypen '#{TYPE_RUT}' får inte innehålla rader med husarbetestypen '#{type}'/
141
- end
142
-
143
- it 'raises an error' do
144
- expect do
145
- VCR.use_cassette('orders/housework_invalid_tax_reduction_type') { repository.save(document) }
146
- end.to raise_error(Fortnox::API::RemoteServerError, error_message)
147
- end
148
- end
149
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types/invoice_row'
5
- require 'fortnox/api/types/examples/document_row'
6
-
7
- RSpec.describe Fortnox::API::Types::InvoiceRow, type: :type do
8
- subject { described_class }
9
-
10
- it_behaves_like 'DocumentRow', {}
11
- end
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'dry-struct'
5
- require 'fortnox/api/types/model'
6
-
7
- RSpec.describe Fortnox::API::Types::Model do
8
- shared_examples_for 'raises error' do |error|
9
- before do
10
- stub_const('Types::Age', Dry::Types['strict.integer'].constrained(gt: 18).is(:required))
11
-
12
- types_model_user_class = Class.new(Fortnox::API::Types::Model) do
13
- attribute :age, Types::Age
14
- end
15
-
16
- stub_const('TypesModelUser', types_model_user_class)
17
- end
18
-
19
- describe "User inheriting from #{described_class}" do
20
- specify { expect { TypesModelUser.new(args) }.to raise_error(error) }
21
- end
22
- end
23
-
24
- context 'without required keys' do
25
- include_examples 'raises error', Fortnox::API::MissingAttributeError do
26
- let(:args) { {} }
27
- end
28
- end
29
-
30
- context 'when omitting optional keys' do
31
- before do
32
- stub_const('Types::Nullable::String', Dry::Types['strict.string'].optional)
33
-
34
- user_class = Class.new(Fortnox::API::Types::Model) do
35
- attribute :optional_string, Types::Nullable::String
36
- end
37
-
38
- stub_const('User', user_class)
39
- end
40
-
41
- specify { expect { User.new }.not_to raise_error }
42
-
43
- describe 'optional attribute' do
44
- subject { User.new.optional_string }
45
-
46
- it { is_expected.to be_nil }
47
- end
48
- end
49
-
50
- context 'with required keys' do
51
- before do
52
- stub_const('Types::Age', Dry::Types['strict.integer'].constrained(gt: 18).is(:required))
53
-
54
- test_class = Class.new(Fortnox::API::Types::Model) do
55
- attribute :age, Types::Age
56
- end
57
-
58
- stub_const('Model', test_class)
59
- end
60
-
61
- it 'does not raise error' do
62
- expect { Model.new(age: 20) }.not_to raise_error
63
- end
64
-
65
- it 'supports string keys' do
66
- expect { Model.new('age' => 20) }.not_to raise_error
67
- end
68
- end
69
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'dry-struct'
5
- require 'fortnox/api/types'
6
-
7
- describe Fortnox::API::Types::Nullable, type: :type do
8
- subject { TestStruct }
9
-
10
- describe 'String' do
11
- before do
12
- test_struct_class = Class.new(Dry::Struct) do
13
- attribute :string, Fortnox::API::Types::Nullable::String
14
- end
15
-
16
- stub_const('TestStruct', test_struct_class)
17
- end
18
-
19
- it { is_expected.to have_nullable(:string, 'A simple message', 0, '0') }
20
- end
21
-
22
- describe 'Float' do
23
- before do
24
- test_struct_class = Class.new(Dry::Struct) do
25
- attribute :float, Fortnox::API::Types::Nullable::Float
26
- end
27
-
28
- stub_const('TestStruct', test_struct_class)
29
- end
30
-
31
- it { is_expected.to have_nullable(:float, 14.0, 'Not a Float!', 0.0) }
32
- end
33
-
34
- describe 'Integer' do
35
- before do
36
- test_struct_class = Class.new(Dry::Struct) do
37
- attribute :integer, Fortnox::API::Types::Nullable::Integer
38
- end
39
-
40
- stub_const('TestStruct', test_struct_class)
41
- end
42
-
43
- it { is_expected.to have_nullable(:integer, 14, 14.0, 14) }
44
- end
45
-
46
- describe 'Boolean' do
47
- before do
48
- test_struct_class = Class.new(Dry::Struct) do
49
- attribute :boolean, Fortnox::API::Types::Nullable::Boolean
50
- end
51
-
52
- stub_const('TestStruct', test_struct_class)
53
- end
54
-
55
- it { is_expected.to have_nullable(:boolean, true, 'Not a Boolean!', false) }
56
- end
57
-
58
- describe 'Date' do
59
- before do
60
- test_struct_class = Class.new(Dry::Struct) do
61
- attribute :date, Fortnox::API::Types::Nullable::Date
62
- end
63
-
64
- stub_const('TestStruct', test_struct_class)
65
- end
66
-
67
- it { is_expected.to have_nullable_date(:date, Date.new(2016, 1, 1), 'Not a Date!') }
68
-
69
- context 'with empty string' do
70
- subject { TestStruct.new(date: '').date }
71
-
72
- it { is_expected.to be_nil }
73
- end
74
-
75
- context 'with invalid date' do
76
- it { expect { TestStruct.new(date: 'Not a Date!') }.to raise_error(Fortnox::API::AttributeError, /invalid date/) }
77
- end
78
- end
79
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types/order_row'
5
- require 'fortnox/api/types/examples/document_row'
6
-
7
- RSpec.describe Fortnox::API::Types::OrderRow, type: :type do
8
- subject { described_class }
9
-
10
- valid_hash = { ordered_quantity: 10.5 }
11
-
12
- it { is_expected.to require_attribute(:ordered_quantity, valid_hash) }
13
-
14
- it_behaves_like 'DocumentRow', valid_hash
15
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fortnox/api/types'
5
- require 'fortnox/api/types/required'
6
-
7
- describe Fortnox::API::Types::Required, type: :type do
8
- before { stub_const('TestClass', Class.new(Dry::Struct)) }
9
-
10
- shared_examples_for 'required attribute' do |_type|
11
- let(:error_message) { "[#{TestClass}.new] #{:required_attribute.inspect} is missing in Hash input" }
12
- specify { expect { TestClass.new({}) }.to raise_error(Dry::Struct::Error, error_message) }
13
- end
14
-
15
- describe 'String' do
16
- before do
17
- test_class = Class.new(TestClass) do
18
- attribute :required_attribute, Fortnox::API::Types::Required::String
19
- end
20
- stub_const('TestClass', test_class)
21
- end
22
-
23
- include_examples 'required attribute', String
24
- end
25
-
26
- describe 'Float' do
27
- before do
28
- test_class = Class.new(TestClass) do
29
- attribute :required_attribute, Fortnox::API::Types::Required::Float
30
- end
31
- stub_const('TestClass', test_class)
32
- end
33
-
34
- include_examples 'required attribute', Float
35
- end
36
- end
@@ -1,57 +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::SalesAccount }
9
-
10
- describe 'SalesAccount' 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
- [-12_345, -1_234, -123, -1, 0, 1, 12, 123, 1_234.0, 12_345].each do |invalid_number|
24
- context "with #{invalid_number}" do
25
- it 'raises ConstraintError' do
26
- expect { klass[invalid_number] }.to raise_error(Dry::Types::ConstraintError)
27
- end
28
- end
29
- end
30
-
31
- context 'with 4 digits' do
32
- subject { klass[1_234] }
33
-
34
- it { is_expected.to eq('1234') }
35
- end
36
-
37
- context 'when created with valid string' do
38
- include_examples 'equals input', '1234'
39
- end
40
-
41
- context 'when created with a too many digits' do
42
- include_examples 'raises ConstraintError', '12345'
43
- end
44
-
45
- context 'when created with too few digits' do
46
- include_examples 'raises ConstraintError', '123'
47
- end
48
-
49
- context 'when created with a negative number' do
50
- include_examples 'raises ConstraintError', '-1234'
51
- end
52
-
53
- context 'when created with characters' do
54
- include_examples 'raises ConstraintError', 'abcd'
55
- end
56
- end
57
- end
@@ -1,76 +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::Sized do
8
- shared_examples_for 'Sized Types' do
9
- context 'when created with nil' do
10
- subject { klass[nil] }
11
-
12
- it { is_expected.to be_nil }
13
- end
14
- end
15
-
16
- describe 'String' do
17
- max_size = 5
18
- let(:klass) { described_class::String[max_size] }
19
-
20
- it_behaves_like 'Sized Types'
21
-
22
- context 'when created with empty string' do
23
- include_examples 'equals input', ''
24
- end
25
-
26
- context 'when created with fewer characters than the limit' do
27
- include_examples 'equals input', 'a' * (max_size - 1)
28
- end
29
-
30
- context 'when created with valid string' do
31
- include_examples 'equals input', 'a' * max_size
32
- end
33
-
34
- context 'when created with more characters than the limit' do
35
- include_examples 'raises ConstraintError', 'a' * (max_size + 1)
36
- end
37
- end
38
-
39
- shared_examples_for 'Sized Numeric' do |type, min, max, step|
40
- let(:klass) { described_class.const_get(type)[min, max] }
41
-
42
- it_behaves_like 'Sized Types'
43
-
44
- context 'when created with value below the lower limit' do
45
- include_examples 'raises ConstraintError', min - step
46
- end
47
-
48
- context 'when created with value at the lower limit' do
49
- include_examples 'equals input', min
50
- end
51
-
52
- context 'when created with valid number near lower limit' do
53
- include_examples 'equals input', min + step
54
- end
55
-
56
- context 'when created with valid number near upper limit' do
57
- include_examples 'equals input', max - step
58
- end
59
-
60
- context 'when created with value at the upper limit' do
61
- include_examples 'equals input', max
62
- end
63
-
64
- context 'when created with value above the upper limit' do
65
- include_examples 'raises ConstraintError', max + step
66
- end
67
- end
68
-
69
- describe 'Float' do
70
- it_behaves_like 'Sized Numeric', 'Float', 0.0, 100.0, 0.1
71
- end
72
-
73
- describe 'Integer' do
74
- it_behaves_like 'Sized Numeric', 'Integer', 0, 100, 1
75
- end
76
- end