fortnox-api 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +3 -2
  3. data/.env.test +3 -0
  4. data/.rubocop.yml +32 -23
  5. data/.travis.yml +3 -2
  6. data/Guardfile +2 -2
  7. data/LICENSE.txt +165 -22
  8. data/README.md +56 -37
  9. data/fortnox-api.gemspec +9 -6
  10. data/lib/fortnox/api.rb +18 -2
  11. data/lib/fortnox/api/base.rb +5 -3
  12. data/lib/fortnox/api/environment_validation.rb +51 -6
  13. data/lib/fortnox/api/mappers.rb +49 -0
  14. data/lib/fortnox/api/mappers/base.rb +47 -0
  15. data/lib/fortnox/api/mappers/base/from_json.rb +78 -0
  16. data/lib/fortnox/api/mappers/base/to_json.rb +65 -0
  17. data/lib/fortnox/api/mappers/customer.rb +27 -0
  18. data/lib/fortnox/api/mappers/default_delivery_types.rb +13 -0
  19. data/lib/fortnox/api/mappers/default_templates.rb +15 -0
  20. data/lib/fortnox/api/mappers/edi_information.rb +22 -0
  21. data/lib/fortnox/api/mappers/email_information.rb +18 -0
  22. data/lib/fortnox/api/mappers/invoice.rb +27 -0
  23. data/lib/fortnox/api/mappers/invoice_row.rb +20 -0
  24. data/lib/fortnox/api/mappers/order.rb +23 -0
  25. data/lib/fortnox/api/mappers/order_row.rb +16 -0
  26. data/lib/fortnox/api/models.rb +2 -0
  27. data/lib/fortnox/api/models/base.rb +56 -13
  28. data/lib/fortnox/api/models/customer.rb +112 -101
  29. data/lib/fortnox/api/models/document_base.rb +189 -0
  30. data/lib/fortnox/api/models/invoice.rb +29 -195
  31. data/lib/fortnox/api/models/label.rb +17 -0
  32. data/lib/fortnox/api/models/order.rb +27 -0
  33. data/lib/fortnox/api/repositories.rb +2 -0
  34. data/lib/fortnox/api/repositories/base.rb +4 -5
  35. data/lib/fortnox/api/repositories/base/loaders.rb +22 -14
  36. data/lib/fortnox/api/repositories/base/savers.rb +30 -16
  37. data/lib/fortnox/api/repositories/customer.rb +3 -25
  38. data/lib/fortnox/api/repositories/invoice.rb +3 -22
  39. data/lib/fortnox/api/repositories/order.rb +16 -0
  40. data/lib/fortnox/api/request_handling.rb +3 -3
  41. data/lib/fortnox/api/types.rb +44 -0
  42. data/lib/fortnox/api/types/default_delivery_types.rb +20 -0
  43. data/lib/fortnox/api/types/default_templates.rb +23 -0
  44. data/lib/fortnox/api/types/defaulted.rb +11 -0
  45. data/lib/fortnox/api/types/document_row.rb +65 -0
  46. data/lib/fortnox/api/types/edi_information.rb +29 -0
  47. data/lib/fortnox/api/types/email_information.rb +26 -0
  48. data/lib/fortnox/api/types/enums.rb +75 -0
  49. data/lib/fortnox/api/types/invoice_row.rb +19 -0
  50. data/lib/fortnox/api/types/model.rb +40 -0
  51. data/lib/fortnox/api/types/nullable.rb +21 -0
  52. data/lib/fortnox/api/types/order_row.rb +16 -0
  53. data/lib/fortnox/api/types/required.rb +13 -0
  54. data/lib/fortnox/api/types/sized.rb +25 -0
  55. data/lib/fortnox/api/version.rb +1 -1
  56. data/spec/fortnox/api/base_spec.rb +85 -14
  57. data/spec/fortnox/api/mappers/base/from_json_spec.rb +70 -0
  58. data/spec/fortnox/api/mappers/base/to_json_spec.rb +76 -0
  59. data/spec/fortnox/api/mappers/base_spec.rb +156 -0
  60. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +56 -0
  61. data/spec/fortnox/api/mappers/customer_spec.rb +25 -0
  62. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +12 -0
  63. data/spec/fortnox/api/mappers/edi_information_spec.rb +21 -0
  64. data/spec/fortnox/api/mappers/email_information_spec.rb +17 -0
  65. data/spec/fortnox/api/mappers/examples/mapper.rb +26 -0
  66. data/spec/fortnox/api/mappers/invoice_row_spec.rb +19 -0
  67. data/spec/fortnox/api/mappers/invoice_spec.rb +24 -0
  68. data/spec/fortnox/api/mappers/order_row_spec.rb +14 -0
  69. data/spec/fortnox/api/mappers/order_spec.rb +20 -0
  70. data/spec/fortnox/api/models/base_spec.rb +44 -22
  71. data/spec/fortnox/api/models/customer_spec.rb +9 -0
  72. data/spec/fortnox/api/models/examples/document_base.rb +13 -0
  73. data/spec/fortnox/api/models/examples/model.rb +13 -0
  74. data/spec/fortnox/api/models/invoice_spec.rb +7 -31
  75. data/spec/fortnox/api/models/order_spec.rb +13 -0
  76. data/spec/fortnox/api/repositories/customer_spec.rb +20 -76
  77. data/spec/fortnox/api/repositories/examples/all.rb +17 -0
  78. data/spec/fortnox/api/repositories/examples/find.rb +25 -0
  79. data/spec/fortnox/api/repositories/examples/only.rb +42 -0
  80. data/spec/fortnox/api/repositories/examples/save.rb +69 -0
  81. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +32 -0
  82. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +27 -0
  83. data/spec/fortnox/api/repositories/examples/search.rb +31 -0
  84. data/spec/fortnox/api/repositories/invoice_spec.rb +36 -5
  85. data/spec/fortnox/api/repositories/order_spec.rb +35 -0
  86. data/spec/fortnox/api/types/account_number_spec.rb +28 -0
  87. data/spec/fortnox/api/types/default_delivery_types_spec.rb +10 -0
  88. data/spec/fortnox/api/types/edi_information_spec.rb +13 -0
  89. data/spec/fortnox/api/types/email_information_spec.rb +13 -0
  90. data/spec/fortnox/api/types/email_spec.rb +29 -0
  91. data/spec/fortnox/api/types/enums_spec.rb +13 -0
  92. data/spec/fortnox/api/types/examples/document_row.rb +15 -0
  93. data/spec/fortnox/api/types/examples/enum.rb +48 -0
  94. data/spec/fortnox/api/types/examples/types.rb +9 -0
  95. data/spec/fortnox/api/types/house_work_types_spec.rb +60 -0
  96. data/spec/fortnox/api/types/invoice_row_spec.rb +9 -0
  97. data/spec/fortnox/api/types/model_spec.rb +56 -0
  98. data/spec/fortnox/api/types/nullable_spec.rb +57 -0
  99. data/spec/fortnox/api/types/order_row_spec.rb +13 -0
  100. data/spec/fortnox/api/types/required_spec.rb +42 -0
  101. data/spec/fortnox/api/types/sized_spec.rb +74 -0
  102. data/spec/fortnox/api_spec.rb +16 -15
  103. data/spec/spec_helper.rb +19 -9
  104. data/spec/support/helpers/dummy_class_helper.rb +19 -0
  105. data/spec/support/helpers/environment_helper.rb +7 -0
  106. data/spec/support/helpers/repository_helper.rb +8 -0
  107. data/spec/support/helpers/when_performing_helper.rb +5 -0
  108. data/spec/support/matchers.rb +1 -1
  109. data/spec/support/matchers/type.rb +17 -0
  110. data/spec/support/matchers/type/attribute_matcher.rb +39 -0
  111. data/spec/support/matchers/type/enum_matcher.rb +21 -0
  112. data/spec/support/matchers/type/have_account_number_matcher.rb +21 -0
  113. data/spec/support/matchers/type/have_country_code_matcher.rb +13 -0
  114. data/spec/support/matchers/type/have_currency_matcher.rb +7 -0
  115. data/spec/support/matchers/type/have_customer_type_matcher.rb +13 -0
  116. data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +7 -0
  117. data/spec/support/matchers/type/have_discount_type_matcher.rb +7 -0
  118. data/spec/support/matchers/type/have_email_matcher.rb +22 -0
  119. data/spec/support/matchers/type/have_house_work_type_matcher.rb +7 -0
  120. data/spec/support/matchers/type/have_nullable_date_matcher.rb +58 -0
  121. data/spec/support/matchers/type/have_nullable_matcher.rb +52 -0
  122. data/spec/support/matchers/type/have_nullable_string_matcher.rb +49 -0
  123. data/spec/support/matchers/type/have_sized_float_matcher.rb +8 -0
  124. data/spec/support/matchers/type/have_sized_integer_matcher.rb +8 -0
  125. data/spec/support/matchers/type/have_sized_string_matcher.rb +35 -0
  126. data/spec/support/matchers/type/have_vat_type_matcher.rb +7 -0
  127. data/spec/support/matchers/type/numeric_matcher.rb +50 -0
  128. data/spec/support/matchers/type/require_attribute_matcher.rb +69 -0
  129. data/spec/support/matchers/type/type_matcher.rb +38 -0
  130. data/spec/vcr_cassettes/customers/all.yml +119 -9
  131. data/spec/vcr_cassettes/customers/find_id_1.yml +8 -9
  132. data/spec/vcr_cassettes/customers/find_new.yml +46 -0
  133. data/spec/vcr_cassettes/customers/save_new.yml +9 -11
  134. data/spec/vcr_cassettes/customers/save_old.yml +9 -12
  135. data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +45 -0
  136. data/spec/vcr_cassettes/customers/search_by_name.yml +66 -0
  137. data/spec/vcr_cassettes/customers/search_miss.yml +45 -0
  138. data/spec/vcr_cassettes/invoices/all.yml +104 -0
  139. data/spec/vcr_cassettes/invoices/filter_hit.yml +46 -0
  140. data/spec/vcr_cassettes/invoices/filter_invalid.yml +42 -0
  141. data/spec/vcr_cassettes/invoices/find_id_1.yml +47 -0
  142. data/spec/vcr_cassettes/invoices/find_new.yml +49 -0
  143. data/spec/vcr_cassettes/invoices/save_new.yml +48 -0
  144. data/spec/vcr_cassettes/invoices/save_old.yml +49 -0
  145. data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +47 -0
  146. data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +47 -0
  147. data/spec/vcr_cassettes/invoices/search_by_name.yml +48 -0
  148. data/spec/vcr_cassettes/invoices/search_miss.yml +45 -0
  149. data/spec/vcr_cassettes/orders/all.yml +144 -0
  150. data/spec/vcr_cassettes/orders/filter_hit.yml +48 -0
  151. data/spec/vcr_cassettes/orders/filter_invalid.yml +42 -0
  152. data/spec/vcr_cassettes/orders/find_id_1.yml +48 -0
  153. data/spec/vcr_cassettes/orders/find_new.yml +49 -0
  154. data/spec/vcr_cassettes/orders/house_work_type_babysitting.yml +47 -0
  155. data/spec/vcr_cassettes/orders/house_work_type_cleaning.yml +47 -0
  156. data/spec/vcr_cassettes/orders/house_work_type_construction.yml +47 -0
  157. data/spec/vcr_cassettes/orders/house_work_type_cooking.yml +43 -0
  158. data/spec/vcr_cassettes/orders/house_work_type_electricity.yml +47 -0
  159. data/spec/vcr_cassettes/orders/house_work_type_gardening.yml +47 -0
  160. data/spec/vcr_cassettes/orders/house_work_type_glassmetalwork.yml +47 -0
  161. data/spec/vcr_cassettes/orders/house_work_type_grounddrainagework.yml +47 -0
  162. data/spec/vcr_cassettes/orders/house_work_type_hvac.yml +47 -0
  163. data/spec/vcr_cassettes/orders/house_work_type_masonry.yml +47 -0
  164. data/spec/vcr_cassettes/orders/house_work_type_othercare.yml +47 -0
  165. data/spec/vcr_cassettes/orders/house_work_type_othercosts.yml +47 -0
  166. data/spec/vcr_cassettes/orders/house_work_type_paintingwallpapering.yml +47 -0
  167. data/spec/vcr_cassettes/orders/house_work_type_snowplowing.yml +47 -0
  168. data/spec/vcr_cassettes/orders/house_work_type_textileclothing.yml +47 -0
  169. data/spec/vcr_cassettes/orders/house_work_type_tutoring.yml +43 -0
  170. data/spec/vcr_cassettes/orders/save_new.yml +48 -0
  171. data/spec/vcr_cassettes/orders/save_old.yml +49 -0
  172. data/spec/vcr_cassettes/orders/save_with_nested_model.yml +47 -0
  173. data/spec/vcr_cassettes/orders/search_by_name.yml +47 -0
  174. data/spec/vcr_cassettes/orders/search_miss.yml +45 -0
  175. metadata +301 -71
  176. data/lib/fortnox/api/models/attributes/country_code.rb +0 -17
  177. data/lib/fortnox/api/models/attributes/currency.rb +0 -17
  178. data/lib/fortnox/api/models/edi_information.rb +0 -28
  179. data/lib/fortnox/api/models/email_information.rb +0 -25
  180. data/lib/fortnox/api/models/row.rb +0 -82
  181. data/lib/fortnox/api/repositories/base/json_convertion.rb +0 -68
  182. data/lib/fortnox/api/repositories/base/options.rb +0 -33
  183. data/lib/fortnox/api/validators.rb +0 -1
  184. data/lib/fortnox/api/validators/attributes/country_code.rb +0 -42
  185. data/lib/fortnox/api/validators/attributes/currency.rb +0 -38
  186. data/lib/fortnox/api/validators/base.rb +0 -70
  187. data/lib/fortnox/api/validators/constant.rb +0 -21
  188. data/lib/fortnox/api/validators/customer.rb +0 -29
  189. data/lib/fortnox/api/validators/edi_information.rb +0 -11
  190. data/lib/fortnox/api/validators/email_information.rb +0 -19
  191. data/lib/fortnox/api/validators/invoice.rb +0 -33
  192. data/lib/fortnox/api/validators/row.rb +0 -22
  193. data/spec/fortnox/api/models/attributes/country_code_spec.rb +0 -23
  194. data/spec/fortnox/api/models/attributes/currency_spec.rb +0 -23
  195. data/spec/fortnox/api/models/attributes/dummy_model_context.rb +0 -9
  196. data/spec/fortnox/api/models/row_spec.rb +0 -13
  197. data/spec/fortnox/api/repositories/context.rb +0 -10
  198. data/spec/fortnox/api/repositories/examples.rb +0 -16
  199. data/spec/fortnox/api/validators/attributes/country_code_spec.rb +0 -9
  200. data/spec/fortnox/api/validators/attributes/currency_spec.rb +0 -9
  201. data/spec/fortnox/api/validators/attributes/examples_for_validate.rb +0 -29
  202. data/spec/fortnox/api/validators/base_spec.rb +0 -61
  203. data/spec/fortnox/api/validators/constant_spec.rb +0 -12
  204. data/spec/fortnox/api/validators/context.rb +0 -102
  205. data/spec/fortnox/api/validators/customer_spec.rb +0 -31
  206. data/spec/fortnox/api/validators/edi_information_spec.rb +0 -18
  207. data/spec/fortnox/api/validators/email_information_spec.rb +0 -26
  208. data/spec/fortnox/api/validators/invoice_spec.rb +0 -36
  209. data/spec/fortnox/api/validators/row_spec.rb +0 -27
  210. data/spec/fortnox/api/validators/validator_examples.rb +0 -20
  211. data/spec/support/matchers/models.rb +0 -27
  212. data/spec/support/matchers/validators.rb +0 -36
@@ -1,29 +0,0 @@
1
- require "fortnox/api/validators/base"
2
- require "fortnox/api/validators/attributes/country_code"
3
- require "fortnox/api/validators/attributes/currency"
4
-
5
- module Fortnox
6
- module API
7
- module Validator
8
- class Customer < Fortnox::API::Validator::Base
9
-
10
- include Fortnox::API::Validator::Attribute::CountryCode
11
- include Fortnox::API::Validator::Attribute::Currency
12
-
13
- using_validations do
14
-
15
- VAT_TYPES = ['SEVAT', 'SEREVERSEDVAT', 'EUREVERSEDVAT', 'EUVAT', 'EXPORT']
16
- TYPES = ['PRIVATE', 'COMPANY']
17
-
18
- validates_presence_of :name
19
-
20
- validates_inclusion_of :sales_account, within: (0..9999), if: :sales_account?
21
- validates_inclusion_of :type, within: TYPES, if: :type?
22
- validates_inclusion_of :vat_type, within: VAT_TYPES, if: :vat_type?
23
-
24
- end
25
-
26
- end
27
- end
28
- end
29
- end
@@ -1,11 +0,0 @@
1
- require "fortnox/api/validators/constant"
2
-
3
- module Fortnox
4
- module API
5
- module Validator
6
- class EDIInformation < Fortnox::API::Validator::Constant
7
-
8
- end
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
1
- require "fortnox/api/validators/base"
2
-
3
- module Fortnox
4
- module API
5
- module Validator
6
- class EmailInformation < Fortnox::API::Validator::Base
7
-
8
- using_validations do
9
- validates_length_of :email_address_to, length: 0..1024, if: :email_address_to?
10
- validates_length_of :email_address_cc, length: 0..1024, if: :email_address_cc?
11
- validates_length_of :email_address_bcc, length: 0..1024, if: :email_address_bcc?
12
- validates_length_of :email_subject, length: 0..100, if: :email_subject?
13
- validates_length_of :email_body, length: 0..20000, if: :email_body?
14
- end
15
-
16
- end
17
- end
18
- end
19
- end
@@ -1,33 +0,0 @@
1
- require "fortnox/api/validators/base"
2
-
3
- module Fortnox
4
- module API
5
- module Validator
6
- class Invoice < Fortnox::API::Validator::Base
7
-
8
- using_validations do
9
- validates_presence_of :customer_number
10
-
11
- validates_inclusion_of :administration_fee, within: (0..99_999_999_999.0), if: :administration_fee?
12
- validates_inclusion_of :currency_rate, within: (0..999_999_999_999_999.0), if: :currency_rate?
13
- validates_inclusion_of :currency_unit, within: (0..999_999_999_999_999.0), if: :currency_unit?
14
- validates_inclusion_of :freight, within: (0..99_999_999_999.0), if: :freight?
15
-
16
- validates_length_of :address1, length: 0..1024, if: :address1?
17
- validates_length_of :address2, length: 0..1024, if: :address2?
18
- validates_length_of :customer_name, length: 0..1024, if: :customer_name?
19
- validates_length_of :external_invoice_reference1, length: 0..80, if: :external_invoice_reference1?
20
- validates_length_of :external_invoice_reference2, length: 0..80, if: :external_invoice_reference2?
21
- validates_length_of :our_reference, length: 0..50, if: :our_reference?
22
- validates_length_of :phone1, length: 0..1024, if: :phone1?
23
- validates_length_of :phone2, length: 0..1024, if: :phone2?
24
- validates_length_of :remarks, length: 0..1024, if: :remarks?
25
- validates_length_of :your_order_number, length: 0..30, if: :your_order_number?
26
- validates_length_of :your_reference, length: 0..50, if: :your_reference?
27
- validates_length_of :zip_code, length: 0..1024, if: :zip_code?
28
- end
29
-
30
- end
31
- end
32
- end
33
- end
@@ -1,22 +0,0 @@
1
- require "fortnox/api/validators/base"
2
-
3
- module Fortnox
4
- module API
5
- module Validator
6
- class Row < Fortnox::API::Validator::Base
7
-
8
- using_validations do
9
- validates_length_of :article_number, length: 0..50, if: :article_number?
10
- validates_length_of :description, length: 0..50, if: :description?
11
-
12
- validates_inclusion_of :account_number, within: (0..9999), if: :account_number?
13
- validates_inclusion_of :delivered_quantity, within: (0..9_999_999_999_999.0), if: :delivered_quantity?
14
- validates_inclusion_of :discount, within: (0..99_999_999_999.0), if: :discount?
15
- validates_inclusion_of :house_work_hours_to_report, within: (0..99_999), if: :house_work_hours_to_report?
16
- validates_inclusion_of :price, within: (0..99_999_999_999.0), if: :price?
17
- end
18
-
19
- end
20
- end
21
- end
22
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/attributes/country_code'
3
- require 'fortnox/api/models/attributes/dummy_model_context'
4
-
5
- describe Fortnox::API::Model::Attribute::CountryCode do
6
-
7
- include_context 'create dummy Model that includes described_class'
8
-
9
- describe '.new' do
10
- context 'with country code' do
11
- it 'ignores empty values' do
12
- test_case = Model.new()
13
- expect( test_case.country_code ).to eql( nil )
14
- end
15
-
16
- it 'truncates to two characters' do
17
- test_case = Model.new( country_code: 'sek' )
18
- expect( test_case.country_code ).to eql( 'SE' )
19
- end
20
- end
21
- end
22
-
23
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/attributes/currency'
3
- require 'fortnox/api/models/attributes/dummy_model_context'
4
-
5
- describe Fortnox::API::Model::Attribute::Currency do
6
-
7
- include_context 'create dummy Model that includes described_class'
8
-
9
- subject{ instance.currency }
10
-
11
- describe '.new' do
12
- context 'with empty country code' do
13
- let( :instance ){ Model.new() }
14
- it{ is_expected.to eql( nil ) }
15
- end
16
-
17
- context 'with too long country code' do
18
- let( :instance ){ Model.new( currency: 'usdollar' ) }
19
- it{ is_expected.to eql( 'USD' ) }
20
- end
21
- end
22
-
23
- end
@@ -1,9 +0,0 @@
1
- shared_context 'create dummy Model that includes described_class' do
2
- using_test_class do
3
- class Model
4
- include Virtus.model
5
- end
6
-
7
- Model.send(:include, described_class)
8
- end
9
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/row'
3
-
4
- describe Fortnox::API::Model::Row do
5
- describe '.new' do
6
- it{ is_expected.to upcase_lower_case_for( :discount_type, 'amount' ) }
7
- it{ is_expected.to upcase_lower_case_for( :house_work_type, 'cooking' ) }
8
-
9
- it{ is_expected.to return_nil_for_invalid_types( :discount_type, 'INVALID_TYPE' ) }
10
- it{ is_expected.to return_nil_for_invalid_types( :house_work_type, 'INVALID_TYPE' ) }
11
- end
12
- end
13
-
@@ -1,10 +0,0 @@
1
- require 'fortnox/api/repositories/examples'
2
- require 'fortnox/api'
3
-
4
- shared_context 'repository context' do
5
- before(:each){
6
- ENV['FORTNOX_API_BASE_URL'] = 'http://api.fortnox.se/3'
7
- ENV['FORTNOX_API_CLIENT_SECRET'] = '9aBA8ZgsvR'
8
- ENV['FORTNOX_API_ACCESS_TOKEN'] = 'ccaef817-d5d8-4b1c-a316-54f3e55c5c54'
9
- }
10
- end
@@ -1,16 +0,0 @@
1
- shared_examples_for 'repositories' do |model_class|
2
- describe '#save' do
3
- context "new #{model_class}" do
4
- let( :repository ){ described_class.new }
5
- let( :model ){ model_class.new( unsaved: false ) }
6
-
7
- before do
8
- # Should not make an API request in test!
9
- expect( repository ).not_to receive( :save_new )
10
- expect( repository ).not_to receive( :update_existing )
11
- end
12
-
13
- specify{ expect( repository.save( model )).to eql( true ) }
14
- end
15
- end
16
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/base'
3
- require 'fortnox/api/models/attributes/country_code'
4
- require 'fortnox/api/validators/attributes/country_code'
5
- require 'fortnox/api/validators/attributes/examples_for_validate'
6
-
7
- describe Fortnox::API::Validator::Attribute::CountryCode do
8
- include_examples '.validate', :country_code, 'aaa', 'SE'
9
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/base'
3
- require 'fortnox/api/models/attributes/currency'
4
- require 'fortnox/api/validators/attributes/currency'
5
- require 'fortnox/api/validators/attributes/examples_for_validate'
6
-
7
- describe Fortnox::API::Validator::Attribute::Currency do
8
- include_examples '.validate', :currency, '-_-', 'SEK'
9
- end
@@ -1,29 +0,0 @@
1
- shared_examples_for '.validate' do |attribute, invalid_attribute, valid_attribute|
2
- using_test_classes do
3
- const_name = attribute.to_s.split('_').map(&:capitalize).join
4
-
5
- class Model < Fortnox::API::Model::Base
6
- end
7
- Model.send( :include, Fortnox::API::Model::Attribute. const_get( const_name ) )
8
-
9
- class Validator < Fortnox::API::Validator::Base
10
- end
11
- Validator.send( :include, Fortnox::API::Validator::Attribute. const_get( const_name ) )
12
- end
13
-
14
- describe '.validate' do
15
- subject{ Validator.new }
16
-
17
- context "with :#{attribute} set to '#{invalid_attribute}'" do
18
- let( :invalid_model ){ Model.new( attribute => invalid_attribute ) }
19
-
20
- specify{ expect(subject.validate( invalid_model )).to eql( false ) }
21
- end
22
-
23
- context "with :#{attribute} set to '#{valid_attribute}'" do
24
- let( :valid_model ){ Model.new( attribute => valid_attribute ) }
25
-
26
- specify{ expect( subject.validate( valid_model )).to eql( true ) }
27
- end
28
- end
29
- end
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/base'
3
- require 'fortnox/api/validators/base'
4
- require 'fortnox/api/validators/validator_examples'
5
-
6
- describe Fortnox::API::Validator::Base do
7
-
8
- using_test_classes do
9
- class Model < Fortnox::API::Model::Base
10
- attribute :test_attribute, String
11
- end
12
-
13
- class Validator < Fortnox::API::Validator::Base
14
- using_validations do
15
- validates_presence_of :test_attribute
16
- end
17
- end
18
- end
19
-
20
- subject{ Validator.new }
21
-
22
- it_behaves_like 'validators' do
23
- let( :valid_model ){ Model.new( test_attribute: 'something' ) }
24
- end
25
-
26
- describe 'violations' do
27
- let( :invalid_model ){ Model.new }
28
- let( :valid_model ){ Model.new(test_attribute: 'test') }
29
-
30
- specify 'are not kept between validations' do
31
- expect( subject.validate( invalid_model ) ).to be false
32
- expect( subject.validate( valid_model ) ).to be true
33
- end
34
-
35
- specify 'are not kept between instances' do
36
- expect( subject.validate( invalid_model ) ).to be false
37
- another_validator = Validator.new
38
-
39
- expect( another_validator.validate( valid_model ) ).to be true
40
- expect( another_validator.validate( invalid_model ) ).to be false
41
- end
42
- end
43
-
44
- context 'when no validator given' do
45
- let( :model ){ Model.new }
46
-
47
- subject{ described_class.new }
48
-
49
- specify '#validate raises an error' do
50
- expect{ subject.validate( model ) }.to raise_error(ArgumentError)
51
- end
52
-
53
- specify '#instance raises an error' do
54
- expect{ subject.instance }.to raise_error(ArgumentError)
55
- end
56
-
57
- specify '#violations raises an error' do
58
- expect{ subject.violations }.to raise_error(ArgumentError)
59
- end
60
- end
61
- end
@@ -1,12 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/validators/constant'
3
- require 'fortnox/api/validators/validator_examples'
4
-
5
- describe Fortnox::API::Validator::Constant do
6
-
7
- subject{ Fortnox::API::Validator::Constant.new }
8
-
9
- it_behaves_like 'validators' do
10
- let( :valid_model ){ Class.new{}.new }
11
- end
12
- end
@@ -1,102 +0,0 @@
1
- shared_context 'validator context' do
2
- shared_examples_for 'behaves like valid' do |attribute, value|
3
- let( :updated_model ){ valid_model.update( attribute => value ) }
4
-
5
- it{ is_expected.to be_valid( updated_model ) }
6
- end
7
-
8
- shared_examples_for 'behaves like invalid' do |attribute, value, error_type|
9
- let( :updated_model ){ valid_model.update( attribute => value ) }
10
-
11
- it{ is_expected.to be_invalid( updated_model ) }
12
- it{ is_expected.to include_error_for( updated_model, attribute, error_type ) }
13
- end
14
- shared_examples_for 'invalid' do |attribute, values, error_type|
15
- values.each do |value|
16
- context "when #{attribute.inspect} set to #{value}" do
17
- include_examples 'behaves like invalid', attribute, value, error_type
18
- end
19
- end
20
- end
21
-
22
- shared_examples_for 'valid' do |attribute, values|
23
- values.each do |value|
24
- context "when #{attribute.inspect} set to #{value}" do
25
- include_examples 'behaves like valid', attribute, value
26
- end
27
- end
28
- end
29
-
30
- shared_examples_for 'validates length of string' do |attribute, length|
31
- context "with #{attribute.inspect} set to string with" do
32
- context "length 0 (empty string)" do
33
- include_examples 'behaves like valid', attribute, ''
34
- end
35
-
36
- context "length 1" do
37
- include_examples 'behaves like valid', attribute, 'a'
38
- end
39
- context "max length (#{length} chars)" do
40
- include_examples 'behaves like valid', attribute, 'a' * length
41
- end
42
-
43
- context "max length + 1 (#{length + 1})" do
44
- include_examples 'behaves like invalid', attribute, 'a' * (length + 1), :length
45
- end
46
- end
47
- end
48
-
49
- shared_examples_for 'validates inclusion of number' do |attribute, min_value, max_value|
50
- context "with #{attribute.inspect} set to" do
51
- context "minimum value (#{min_value})" do
52
- include_examples 'behaves like valid', attribute, min_value
53
- end
54
-
55
- context "maximum value (#{max_value})" do
56
- include_examples 'behaves like valid', attribute, max_value
57
- end
58
-
59
- context "too small value (#{min_value - 1})" do
60
- include_examples 'behaves like invalid', attribute, min_value - 1, :inclusion
61
- end
62
-
63
- context "too big value (#{max_value + 1})" do
64
- include_examples 'behaves like invalid', attribute, max_value + 1, :inclusion
65
- end
66
- end
67
- end
68
-
69
- shared_examples_for 'validates inclusion of string' do |attribute, valid_strings, invalid_string|
70
- context "with #{attribute.inspect} set to" do
71
- valid_strings.each do |valid_string|
72
- context "\"#{valid_string}\"" do
73
- include_examples 'behaves like valid', attribute, valid_string
74
- end
75
- end
76
-
77
- if invalid_string.nil?
78
- self::NONSENSE_STRING = valid_strings.first + '123nonsense123'
79
- else
80
- self::NONSENSE_STRING = invalid_string
81
- end
82
-
83
- context "nonsense string '#{self::NONSENSE_STRING}'" do
84
- # Try first valid string and append nonsense
85
- include_examples 'behaves like invalid',
86
- attribute,
87
- self::NONSENSE_STRING,
88
- :inclusion
89
- end
90
- end
91
- end
92
-
93
- shared_examples_for 'required attributes' do |model_class|
94
- context 'with required attributes' do
95
- it{ is_expected.to be_valid( valid_model ) }
96
- end
97
-
98
- context 'without required attributes' do
99
- it{ is_expected.to_not be_valid( model_class.new ) }
100
- end
101
- end
102
- end