fortnox-api 0.5.2 → 0.6.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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +9 -1104
  4. data/.travis.yml +22 -2
  5. data/Gemfile +3 -1
  6. data/Guardfile +4 -2
  7. data/README.md +2 -2
  8. data/Rakefile +3 -1
  9. data/bin/console +17 -3
  10. data/fortnox-api.gemspec +32 -27
  11. data/lib/fortnox/api.rb +17 -16
  12. data/lib/fortnox/api/circular_queue.rb +13 -7
  13. data/lib/fortnox/api/mappers.rb +29 -25
  14. data/lib/fortnox/api/mappers/article.rb +7 -6
  15. data/lib/fortnox/api/mappers/base.rb +18 -16
  16. data/lib/fortnox/api/mappers/base/from_json.rb +37 -30
  17. data/lib/fortnox/api/mappers/base/to_json.rb +39 -37
  18. data/lib/fortnox/api/mappers/customer.rb +7 -7
  19. data/lib/fortnox/api/mappers/default_delivery_types.rb +4 -2
  20. data/lib/fortnox/api/mappers/default_templates.rb +5 -4
  21. data/lib/fortnox/api/mappers/edi_information.rb +5 -4
  22. data/lib/fortnox/api/mappers/email_information.rb +5 -4
  23. data/lib/fortnox/api/mappers/invoice.rb +10 -8
  24. data/lib/fortnox/api/mappers/invoice_row.rb +12 -7
  25. data/lib/fortnox/api/mappers/order.rb +10 -7
  26. data/lib/fortnox/api/mappers/order_row.rb +13 -6
  27. data/lib/fortnox/api/mappers/project.rb +6 -4
  28. data/lib/fortnox/api/mappers/terms_of_payments.rb +17 -0
  29. data/lib/fortnox/api/mappers/unit.rb +17 -0
  30. data/lib/fortnox/api/models.rb +9 -5
  31. data/lib/fortnox/api/models/article.rb +68 -67
  32. data/lib/fortnox/api/models/base.rb +52 -36
  33. data/lib/fortnox/api/models/customer.rb +95 -94
  34. data/lib/fortnox/api/models/document.rb +186 -0
  35. data/lib/fortnox/api/models/invoice.rb +44 -44
  36. data/lib/fortnox/api/models/label.rb +5 -3
  37. data/lib/fortnox/api/models/order.rb +8 -8
  38. data/lib/fortnox/api/models/project.rb +10 -8
  39. data/lib/fortnox/api/models/terms_of_payments.rb +28 -0
  40. data/lib/fortnox/api/models/unit.rb +24 -0
  41. data/lib/fortnox/api/repositories.rb +9 -5
  42. data/lib/fortnox/api/repositories/article.rb +6 -4
  43. data/lib/fortnox/api/repositories/base.rb +49 -46
  44. data/lib/fortnox/api/repositories/base/loaders.rb +32 -36
  45. data/lib/fortnox/api/repositories/base/savers.rb +23 -21
  46. data/lib/fortnox/api/repositories/customer.rb +6 -4
  47. data/lib/fortnox/api/repositories/invoice.rb +6 -4
  48. data/lib/fortnox/api/repositories/order.rb +6 -4
  49. data/lib/fortnox/api/repositories/project.rb +6 -4
  50. data/lib/fortnox/api/repositories/terms_of_payments.rb +17 -0
  51. data/lib/fortnox/api/repositories/unit.rb +17 -0
  52. data/lib/fortnox/api/request_handling.rb +12 -12
  53. data/lib/fortnox/api/types.rb +62 -11
  54. data/lib/fortnox/api/types/default_delivery_types.rb +5 -3
  55. data/lib/fortnox/api/types/default_templates.rb +3 -1
  56. data/lib/fortnox/api/types/defaulted.rb +2 -2
  57. data/lib/fortnox/api/types/document_row.rb +41 -42
  58. data/lib/fortnox/api/types/edi_information.rb +10 -8
  59. data/lib/fortnox/api/types/email_information.rb +10 -8
  60. data/lib/fortnox/api/types/enums.rb +60 -47
  61. data/lib/fortnox/api/types/invoice_row.rb +8 -8
  62. data/lib/fortnox/api/types/model.rb +14 -10
  63. data/lib/fortnox/api/types/nullable.rb +7 -7
  64. data/lib/fortnox/api/types/order_row.rb +5 -5
  65. data/lib/fortnox/api/types/required.rb +5 -5
  66. data/lib/fortnox/api/types/sized.rb +14 -6
  67. data/lib/fortnox/api/version.rb +3 -1
  68. data/spec/fortnox/api/mappers/article_spec.rb +3 -1
  69. data/spec/fortnox/api/mappers/base/from_json_spec.rb +15 -13
  70. data/spec/fortnox/api/mappers/base/to_json_spec.rb +4 -3
  71. data/spec/fortnox/api/mappers/base_spec.rb +40 -35
  72. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +12 -11
  73. data/spec/fortnox/api/mappers/customer_spec.rb +3 -1
  74. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +3 -1
  75. data/spec/fortnox/api/mappers/edi_information_spec.rb +4 -2
  76. data/spec/fortnox/api/mappers/email_information_spec.rb +4 -2
  77. data/spec/fortnox/api/mappers/examples/mapper.rb +17 -9
  78. data/spec/fortnox/api/mappers/invoice_row_spec.rb +8 -3
  79. data/spec/fortnox/api/mappers/invoice_spec.rb +4 -1
  80. data/spec/fortnox/api/mappers/order_row_spec.rb +9 -2
  81. data/spec/fortnox/api/mappers/order_spec.rb +4 -1
  82. data/spec/fortnox/api/mappers/project_spec.rb +3 -1
  83. data/spec/fortnox/api/mappers/terms_of_payments_spec.rb +16 -0
  84. data/spec/fortnox/api/mappers/unit_spec.rb +57 -0
  85. data/spec/fortnox/api/models/article_spec.rb +2 -0
  86. data/spec/fortnox/api/models/base_spec.rb +46 -38
  87. data/spec/fortnox/api/models/customer_spec.rb +2 -0
  88. data/spec/fortnox/api/models/examples/document_base.rb +5 -3
  89. data/spec/fortnox/api/models/examples/model.rb +12 -9
  90. data/spec/fortnox/api/models/invoice_spec.rb +2 -0
  91. data/spec/fortnox/api/models/order_spec.rb +2 -0
  92. data/spec/fortnox/api/models/project_spec.rb +2 -0
  93. data/spec/fortnox/api/models/terms_of_payments_spec.rb +9 -0
  94. data/spec/fortnox/api/models/unit_spec.rb +31 -0
  95. data/spec/fortnox/api/repositories/article_spec.rb +7 -5
  96. data/spec/fortnox/api/repositories/base_spec.rb +121 -100
  97. data/spec/fortnox/api/repositories/customer_spec.rb +7 -5
  98. data/spec/fortnox/api/repositories/examples/all.rb +5 -4
  99. data/spec/fortnox/api/repositories/examples/find.rb +50 -41
  100. data/spec/fortnox/api/repositories/examples/only.rb +14 -13
  101. data/spec/fortnox/api/repositories/examples/save.rb +23 -29
  102. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +11 -11
  103. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +11 -10
  104. data/spec/fortnox/api/repositories/examples/search.rb +15 -15
  105. data/spec/fortnox/api/repositories/invoice_spec.rb +8 -6
  106. data/spec/fortnox/api/repositories/order_spec.rb +8 -6
  107. data/spec/fortnox/api/repositories/project_spec.rb +7 -5
  108. data/spec/fortnox/api/repositories/terms_of_payments_spec.rb +30 -0
  109. data/spec/fortnox/api/repositories/unit_spec.rb +34 -0
  110. data/spec/fortnox/api/types/account_number_spec.rb +12 -9
  111. data/spec/fortnox/api/types/default_delivery_types_spec.rb +6 -4
  112. data/spec/fortnox/api/types/edi_information_spec.rb +9 -7
  113. data/spec/fortnox/api/types/email_information_spec.rb +8 -6
  114. data/spec/fortnox/api/types/email_spec.rb +27 -14
  115. data/spec/fortnox/api/types/enums_spec.rb +3 -1
  116. data/spec/fortnox/api/types/examples/document_row.rb +10 -8
  117. data/spec/fortnox/api/types/examples/enum.rb +29 -22
  118. data/spec/fortnox/api/types/examples/types.rb +8 -4
  119. data/spec/fortnox/api/types/housework_types_spec.rb +68 -0
  120. data/spec/fortnox/api/types/invoice_row_spec.rb +3 -1
  121. data/spec/fortnox/api/types/model_spec.rb +12 -9
  122. data/spec/fortnox/api/types/nullable_spec.rb +8 -6
  123. data/spec/fortnox/api/types/order_row_spec.rb +4 -2
  124. data/spec/fortnox/api/types/required_spec.rb +4 -2
  125. data/spec/fortnox/api/types/sized_spec.rb +18 -16
  126. data/spec/fortnox/api_spec.rb +45 -43
  127. data/spec/spec_helper.rb +9 -6
  128. data/spec/support/helpers.rb +3 -1
  129. data/spec/support/helpers/configuration_helper.rb +2 -0
  130. data/spec/support/helpers/dummy_class_helper.rb +7 -8
  131. data/spec/support/helpers/repository_helper.rb +2 -0
  132. data/spec/support/helpers/when_performing_helper.rb +3 -1
  133. data/spec/support/matchers.rb +2 -0
  134. data/spec/support/matchers/type.rb +3 -1
  135. data/spec/support/matchers/type/attribute_matcher.rb +15 -14
  136. data/spec/support/matchers/type/enum_matcher.rb +9 -7
  137. data/spec/support/matchers/type/have_account_number_matcher.rb +11 -9
  138. data/spec/support/matchers/type/have_country_code_matcher.rb +6 -4
  139. data/spec/support/matchers/type/have_currency_matcher.rb +4 -2
  140. data/spec/support/matchers/type/have_customer_type_matcher.rb +6 -4
  141. data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +4 -2
  142. data/spec/support/matchers/type/have_discount_type_matcher.rb +4 -2
  143. data/spec/support/matchers/type/have_email_matcher.rb +11 -9
  144. data/spec/support/matchers/type/have_housework_type_matcher.rb +9 -0
  145. data/spec/support/matchers/type/have_nullable_date_matcher.rb +29 -29
  146. data/spec/support/matchers/type/have_nullable_matcher.rb +23 -21
  147. data/spec/support/matchers/type/have_nullable_string_matcher.rb +30 -32
  148. data/spec/support/matchers/type/have_sized_float_matcher.rb +4 -2
  149. data/spec/support/matchers/type/have_sized_integer_matcher.rb +4 -2
  150. data/spec/support/matchers/type/have_sized_string_matcher.rb +16 -15
  151. data/spec/support/matchers/type/have_vat_type_matcher.rb +4 -2
  152. data/spec/support/matchers/type/numeric_matcher.rb +25 -23
  153. data/spec/support/matchers/type/require_attribute_matcher.rb +36 -37
  154. data/spec/support/matchers/type/type_matcher.rb +18 -16
  155. data/spec/support/vcr_setup.rb +2 -0
  156. data/spec/vcr_cassettes/orders/{house_work_type_babysitting.yml → housework_type_babysitting.yml} +9 -10
  157. data/spec/vcr_cassettes/orders/{house_work_type_cleaning.yml → housework_type_cleaning.yml} +9 -10
  158. data/spec/vcr_cassettes/orders/{house_work_type_construction.yml → housework_type_construction.yml} +9 -10
  159. data/spec/vcr_cassettes/orders/{house_work_type_cooking.yml → housework_type_cooking.yml} +7 -7
  160. data/spec/vcr_cassettes/orders/{house_work_type_electricity.yml → housework_type_electricity.yml} +9 -10
  161. data/spec/vcr_cassettes/orders/{house_work_type_gardening.yml → housework_type_gardening.yml} +9 -10
  162. data/spec/vcr_cassettes/orders/{house_work_type_glassmetalwork.yml → housework_type_glassmetalwork.yml} +9 -10
  163. data/spec/vcr_cassettes/orders/{house_work_type_grounddrainagework.yml → housework_type_grounddrainagework.yml} +9 -10
  164. data/spec/vcr_cassettes/orders/{house_work_type_hvac.yml → housework_type_hvac.yml} +9 -10
  165. data/spec/vcr_cassettes/orders/{house_work_type_masonry.yml → housework_type_masonry.yml} +9 -10
  166. data/spec/vcr_cassettes/orders/{house_work_type_othercare.yml → housework_type_othercare.yml} +9 -10
  167. data/spec/vcr_cassettes/orders/{house_work_type_othercosts.yml → housework_type_othercosts.yml} +9 -10
  168. data/spec/vcr_cassettes/orders/{house_work_type_paintingwallpapering.yml → housework_type_paintingwallpapering.yml} +9 -10
  169. data/spec/vcr_cassettes/orders/{house_work_type_snowplowing.yml → housework_type_snowplowing.yml} +9 -10
  170. data/spec/vcr_cassettes/orders/{house_work_type_textileclothing.yml → housework_type_textileclothing.yml} +9 -10
  171. data/spec/vcr_cassettes/orders/{house_work_type_tutoring.yml → housework_type_tutoring.yml} +7 -7
  172. data/spec/vcr_cassettes/termsofpayments/all.yml +51 -0
  173. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +45 -0
  174. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +46 -0
  175. data/spec/vcr_cassettes/termsofpayments/find_new.yml +46 -0
  176. data/spec/vcr_cassettes/termsofpayments/save_new.yml +45 -0
  177. data/spec/vcr_cassettes/termsofpayments/save_old.yml +46 -0
  178. data/spec/vcr_cassettes/units/all.yml +48 -0
  179. data/spec/vcr_cassettes/units/find_failure.yml +45 -0
  180. data/spec/vcr_cassettes/units/find_id_1.yml +46 -0
  181. data/spec/vcr_cassettes/units/find_new.yml +48 -0
  182. data/spec/vcr_cassettes/units/save_new.yml +47 -0
  183. data/spec/vcr_cassettes/units/save_old.yml +48 -0
  184. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +47 -0
  185. metadata +127 -88
  186. data/docs/account.rb +0 -59
  187. data/docs/extraction_script.js +0 -23
  188. data/docs/generation_script.rb +0 -43
  189. data/docs/json/account.json +0 -77
  190. data/lib/fortnox/api/models/document_base.rb +0 -189
  191. data/spec/fortnox/api/types/house_work_types_spec.rb +0 -64
  192. data/spec/support/matchers/type/have_house_work_type_matcher.rb +0 -7
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
- def have_nullable( attribute, valid_value, invalid_value, default_value )
4
- HaveNullableMatcher.new( attribute, valid_value, invalid_value, default_value )
5
+ def have_nullable(attribute, valid_value, invalid_value, default_value)
6
+ HaveNullableMatcher.new(attribute, valid_value, invalid_value, default_value)
5
7
  end
6
8
 
7
9
  class HaveNullableMatcher
8
- def initialize( attribute, valid_value, invalid_value, default_value )
10
+ def initialize(attribute, valid_value, invalid_value, default_value)
9
11
  @attribute = attribute
10
12
  @valid_value = valid_value
11
13
  @invalid_value = invalid_value
@@ -13,40 +15,40 @@ module Matchers
13
15
  @failure_description = ''
14
16
  end
15
17
 
16
- def matches?( klass )
18
+ def matches?(klass)
17
19
  @klass = klass
18
20
 
19
21
  accepts_nil? && accepts_valid_value? && defaults_invalid_value?
20
22
  end
21
23
 
22
24
  def description
23
- "have nullable attribute #{ @attribute.inspect }"
25
+ "have nullable attribute #{@attribute.inspect}"
24
26
  end
25
27
 
26
28
  def failure_message
27
- "Expected class to have nullable attribute #{ @attribute.inspect }" << @failure_description
29
+ "Expected class to have nullable attribute #{@attribute.inspect}" << @failure_description
28
30
  end
29
31
 
30
32
  private
31
33
 
32
- def accepts_nil?
33
- @klass.new(@attribute => nil)
34
- end
34
+ def accepts_nil?
35
+ @klass.new(@attribute => nil)
36
+ end
35
37
 
36
- def accepts_valid_value?
37
- model = @klass.new(@attribute => @valid_value)
38
- model.send(@attribute) == @valid_value
39
- end
38
+ def accepts_valid_value?
39
+ model = @klass.new(@attribute => @valid_value)
40
+ model.send(@attribute) == @valid_value
41
+ end
40
42
 
41
- def defaults_invalid_value?
42
- model = @klass.new(@attribute => @invalid_value)
43
- value = model.send(@attribute)
44
- return true if value == @default_value
43
+ def defaults_invalid_value?
44
+ model = @klass.new(@attribute => @invalid_value)
45
+ value = model.send(@attribute)
46
+ return true if value == @default_value
45
47
 
46
- @failure_description << " (Expected #{ @invalid_value.inspect } to default to "\
47
- "#{ @default_value.inspect }), but got #{ value.inspect }"
48
- false
49
- end
48
+ @failure_description << " (Expected #{@invalid_value.inspect} to default to "\
49
+ "#{@default_value.inspect}), but got #{value.inspect}"
50
+ false
51
+ end
50
52
  end
51
53
  end
52
54
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
- def have_nullable_string( attribute, valid_hash = {} )
4
- HaveNullableStringMatcher.new( attribute, valid_hash )
5
+ def have_nullable_string(attribute, valid_hash = {})
6
+ HaveNullableStringMatcher.new(attribute, valid_hash)
5
7
  end
6
8
 
7
9
  class HaveNullableStringMatcher < AttributeMatcher
8
- def initialize( attribute, valid_hash )
9
- super( attribute, valid_hash, 'nullable string' )
10
+ def initialize(attribute, valid_hash)
11
+ super(attribute, valid_hash, 'nullable string')
10
12
  end
11
13
 
12
- def matches?( klass )
14
+ def matches?(klass)
13
15
  super
14
16
 
15
17
  accepts_nil? && accepts_string? && rejects_non_string?
@@ -17,33 +19,29 @@ module Matchers
17
19
 
18
20
  private
19
21
 
20
- def accepts_nil?
21
- model = @klass.new( @valid_hash.merge( @attribute => nil ) )
22
- model.send(@attribute).nil?
23
- end
24
-
25
- def accepts_string?
26
- valid_string = 'A string'
27
- model = @klass.new( @valid_hash.merge( @attribute => valid_string ) )
28
- model.send(@attribute) == 'A string'
29
- end
30
-
31
- def rejects_non_string?
32
- non_string = 10.0
33
- @klass.new( @valid_hash.merge( @attribute => non_string ) )
34
- rescue Fortnox::API::InvalidAttributeValueError => error
35
- expected_message = "#{ non_string.inspect } (#{ non_string.class }) "\
36
- "has invalid type for #{ @attribute.inspect }"
37
- if error.message.include?(expected_message)
38
- return true
39
- else
40
- fail_message = "Expected error message to include #{ expected_message.inspect }, "\
41
- "but was #{ error.message.inspect }"
42
- fail(fail_message)
43
- end
44
-
45
- end
46
- end
22
+ def accepts_nil?
23
+ model = @klass.new(@valid_hash.merge(@attribute => nil))
24
+ model.send(@attribute).nil?
25
+ end
47
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::InvalidAttributeValueError => error
37
+ expected_message = "#{non_string.inspect} (#{non_string.class}) "\
38
+ "has invalid type for #{@attribute.inspect}"
39
+ return true if error.message.include?(expected_message)
40
+
41
+ fail_message = "Expected error message to include #{expected_message.inspect}, "\
42
+ "but was #{error.message.inspect}"
43
+ raise(fail_message)
44
+ end
45
+ end
48
46
  end
49
47
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
- def have_sized_float( attribute, min_value, max_value, valid_hash = {} )
5
+ def have_sized_float(attribute, min_value, max_value, valid_hash = {})
4
6
  options = { min_value: min_value, max_value: max_value, step: 0.1 }
5
- NumericMatcher.new( attribute, valid_hash, 'sized float', options )
7
+ NumericMatcher.new(attribute, valid_hash, 'sized float', options)
6
8
  end
7
9
  end
8
10
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
- def have_sized_integer( attribute, min_value, max_value, valid_hash = {} )
5
+ def have_sized_integer(attribute, min_value, max_value, valid_hash = {})
4
6
  options = { min_value: min_value, max_value: max_value, step: 1 }
5
- NumericMatcher.new( attribute, valid_hash, 'sized integer', options )
7
+ NumericMatcher.new(attribute, valid_hash, 'sized integer', options)
6
8
  end
7
9
  end
8
10
  end
@@ -1,16 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
- def have_sized_string( attribute, max_size, valid_hash = {} )
4
- HaveSizedStringMatcher.new( attribute, max_size, valid_hash )
5
+ def have_sized_string(attribute, max_size, valid_hash = {})
6
+ HaveSizedStringMatcher.new(attribute, max_size, valid_hash)
5
7
  end
6
8
 
7
9
  class HaveSizedStringMatcher < AttributeMatcher
8
- def initialize( attribute, max_size, valid_hash )
9
- super( attribute, valid_hash, 'sized string' )
10
+ def initialize(attribute, max_size, valid_hash)
11
+ super(attribute, valid_hash, 'sized string')
10
12
  @max_size = max_size
11
13
  end
12
14
 
13
- def matches?( klass )
15
+ def matches?(klass)
14
16
  @klass = klass
15
17
 
16
18
  accepts_max_size? && rejects_too_long_string?
@@ -18,18 +20,17 @@ module Matchers
18
20
 
19
21
  private
20
22
 
21
- def accepts_max_size?
22
- @klass.new( @valid_hash.merge( @attribute => 'a' * @max_size ) )
23
- end
23
+ def accepts_max_size?
24
+ @klass.new(@valid_hash.merge(@attribute => 'a' * @max_size))
25
+ end
24
26
 
25
- def rejects_too_long_string?
26
- too_long = @max_size + 1
27
- too_long_string = 'a' * too_long
28
- expect_error("Exception missing for too long string (#{ too_long } characters)") do
29
- @klass.new( @valid_hash.merge( @attribute => too_long_string ) )
30
- end
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))
31
32
  end
33
+ end
32
34
  end
33
-
34
35
  end
35
36
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
- def have_vat_type( attribute, valid_hash = {} )
4
- EnumMatcher.new( attribute, valid_hash, 'VATType', 'VATTypes' )
5
+ def have_vat_type(attribute, valid_hash = {})
6
+ EnumMatcher.new(attribute, valid_hash, 'VATType', 'VATTypes')
5
7
  end
6
8
  end
7
9
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
5
  class NumericMatcher < AttributeMatcher
4
- def initialize( attribute, valid_hash, attr_type, options )
5
- super( attribute, valid_hash, attr_type )
6
+ def initialize(attribute, valid_hash, attr_type, options)
7
+ super(attribute, valid_hash, attr_type)
6
8
 
7
9
  @min_value = options[:min_value]
8
10
  @max_value = options[:max_value]
9
11
  @step = options[:step]
10
12
  end
11
13
 
12
- def matches?( klass )
14
+ def matches?(klass)
13
15
  super
14
16
 
15
17
  rejects_too_small_value? &&
@@ -20,31 +22,31 @@ module Matchers
20
22
 
21
23
  private
22
24
 
23
- def rejects_too_small_value?
24
- too_small_value = @min_value - @step
25
- expected_error_message = "Exception missing for too small value (#{ too_small_value })"
26
- rejects_value?(too_small_value, expected_error_message)
27
- end
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
28
30
 
29
- def accepts_min_value?
30
- @klass.new( @valid_hash.merge( @attribute => @min_value ) )
31
- end
31
+ def accepts_min_value?
32
+ @klass.new(@valid_hash.merge(@attribute => @min_value))
33
+ end
32
34
 
33
- def accepts_max_value?
34
- @klass.new( @valid_hash.merge( @attribute => @max_value ) )
35
- end
35
+ def accepts_max_value?
36
+ @klass.new(@valid_hash.merge(@attribute => @max_value))
37
+ end
36
38
 
37
- def rejects_too_big_value?
38
- too_big_value = @max_value + @step
39
- expected_error_message = "Exception missing for too big value (#{ too_big_value })"
40
- rejects_value?(too_big_value, expected_error_message)
41
- end
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
42
44
 
43
- def rejects_value?(value, expected_error_message)
44
- expect_error(expected_error_message) do
45
- @klass.new( @valid_hash.merge( @attribute => value ) )
46
- end
45
+ def rejects_value?(value, expected_error_message)
46
+ expect_error(expected_error_message) do
47
+ @klass.new(@valid_hash.merge(@attribute => value))
47
48
  end
49
+ end
48
50
  end
49
51
  end
50
52
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fortnox/api'
2
4
 
3
5
  module Matchers
@@ -9,12 +11,12 @@ module Matchers
9
11
  class RequireAttributeMatcher
10
12
  EXCEPTION = Fortnox::API::MissingAttributeError
11
13
 
12
- def initialize( attribute, valid_hash )
14
+ def initialize(attribute, valid_hash)
13
15
  @attribute = attribute
14
- @invalid_hash = valid_hash.dup.tap{ |hash| hash.delete( attribute ) }
16
+ @invalid_hash = valid_hash.dup.tap { |hash| hash.delete(attribute) }
15
17
  end
16
18
 
17
- def matches?( klass )
19
+ def matches?(klass)
18
20
  @klass = klass
19
21
 
20
22
  raise_error && includes_error_message
@@ -26,44 +28,41 @@ module Matchers
26
28
  end
27
29
 
28
30
  def description
29
- "require attribute #{ @attribute.inspect }"
31
+ "require attribute #{@attribute.inspect}"
30
32
  end
31
33
 
32
34
  private
33
35
 
34
- def raise_error
35
- @klass.new(@invalid_hash)
36
-
37
- false # Fail test since expected error is not thrown
38
-
39
- rescue EXCEPTION
40
- true
41
- end
42
-
43
- def includes_error_message
44
- @klass.new(@invalid_hash)
45
- rescue EXCEPTION => error
46
- if error.message.include? expected_error_message
47
- return true
48
- else
49
- @wrong_error_message = error.message
50
- return false
51
- end
52
- end
53
-
54
- def expected_error_message
55
- @attribute.to_s
56
- end
57
-
58
- def no_exception_failure_message
59
- "Expected class to raise #{ EXCEPTION } "\
60
- "when attribute #{ @attribute.inspect } is missing."
61
- end
62
-
63
- def wrong_error_message
64
- "Expected exception to equal #{ expected_error_message.inspect }. "\
65
- "Message was #{ @wrong_error_message.inspect }."
66
- end
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 => error
47
+ return true if error.message.include? expected_error_message
48
+
49
+ @wrong_error_message = error.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
67
66
  end
68
67
  end
69
68
  end
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Matchers
2
4
  module Type
3
5
  class TypeMatcher < AttributeMatcher
4
- def initialize( attr, valid_hash, attr_name, valid_value, invalid_value )
5
- super( attr, valid_hash, attr_name )
6
+ def initialize(attr, valid_hash, attr_name, valid_value, invalid_value)
7
+ super(attr, valid_hash, attr_name)
6
8
 
7
9
  @valid_value = valid_value
8
10
  @invalid_value = invalid_value
9
11
  end
10
12
 
11
- def matches?( klass )
13
+ def matches?(klass)
12
14
  super
13
15
 
14
16
  correct_type? && rejects_invalid_value? && accepts_valid_value?
@@ -16,23 +18,23 @@ module Matchers
16
18
 
17
19
  private
18
20
 
19
- def correct_type?
20
- return true if expected_type?
21
+ def correct_type?
22
+ return true if expected_type?
21
23
 
22
- @errors << "Attribute #{ @attribute.inspect } was expected to be of type #{ @attribute_type }, but was #{ @actual_type }"
23
- return false
24
- end
24
+ @errors << "Attribute #{@attribute.inspect} was expected to be of type #{@attribute_type}, "\
25
+ "but was #{@actual_type}"
26
+ false
27
+ end
25
28
 
26
- def accepts_valid_value?
27
- @klass.new( @valid_hash.merge( @attribute => @valid_value ) )
28
- end
29
+ def accepts_valid_value?
30
+ @klass.new(@valid_hash.merge(@attribute => @valid_value))
31
+ end
29
32
 
30
- def rejects_invalid_value?
31
- expect_error(@expected_error) do
32
- @klass.new( @valid_hash.merge( @attribute => @invalid_value ) )
33
- end
33
+ def rejects_invalid_value?
34
+ expect_error(@expected_error) do
35
+ @klass.new(@valid_hash.merge(@attribute => @invalid_value))
34
36
  end
35
-
37
+ end
36
38
  end
37
39
  end
38
40
  end