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,31 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/customer'
3
- require 'fortnox/api/validators/context'
4
- require 'fortnox/api/validators/customer'
5
-
6
- describe Fortnox::API::Validator::Customer do
7
- subject{ described_class.new }
8
-
9
- include_context 'validator context' do
10
- let( :valid_model ) do
11
- Fortnox::API::Model::Customer.new( name: 'A customer' )
12
- end
13
- end
14
-
15
- describe '.validate Customer' do
16
- include_examples 'required attributes', Fortnox::API::Model::Customer
17
-
18
- include_examples 'validates inclusion of number', :sales_account, 0, 9999.0
19
-
20
- include_examples 'validates inclusion of string', :type, described_class::TYPES
21
- include_examples 'validates inclusion of string', :vat_type, described_class::VAT_TYPES
22
- include_examples 'validates inclusion of string',
23
- :country_code,
24
- described_class::COUNTRY_CODES,
25
- 'aaa'
26
- include_examples 'validates inclusion of string',
27
- :currency,
28
- described_class::CURRENCIES,
29
- '-_-'
30
- end
31
- end
@@ -1,18 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/validators/context'
3
- require 'fortnox/api/validators/edi_information'
4
- require 'fortnox/api/models/edi_information'
5
-
6
- describe Fortnox::API::Validator::EDIInformation do
7
- let( :model_class ){ Fortnox::API::Model::EDIInformation }
8
-
9
- subject{ described_class.new }
10
-
11
- include_context 'validator context' do
12
- let( :valid_model ){ model_class.new }
13
- end
14
-
15
- describe '.validate EDIInformation' do
16
- it{ is_expected.to be_valid( valid_model ) }
17
- end
18
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/validators/context'
3
- require 'fortnox/api/validators/email_information'
4
- require 'fortnox/api/models/email_information'
5
-
6
- describe Fortnox::API::Validator::EmailInformation do
7
- let( :model_class ){ Fortnox::API::Model::EmailInformation }
8
-
9
- subject{ described_class.new }
10
-
11
- include_context 'validator context' do
12
- let( :valid_model ){ model_class.new }
13
- end
14
-
15
- describe '.validate EmailInformation' do
16
- context 'with required attributes' do
17
- it{ is_expected.to be_valid( valid_model ) }
18
- end
19
-
20
- include_examples 'validates length of string', :email_address_to, 1024
21
- include_examples 'validates length of string', :email_address_cc, 1024
22
- include_examples 'validates length of string', :email_address_bcc, 1024
23
- include_examples 'validates length of string', :email_subject, 100
24
- include_examples 'validates length of string', :email_body, 20000
25
- end
26
- end
@@ -1,36 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/models/invoice'
3
- require 'fortnox/api/validators/context'
4
- require 'fortnox/api/validators/invoice'
5
-
6
- describe Fortnox::API::Validator::Invoice do
7
- let( :model_class ){ Fortnox::API::Model::Invoice }
8
-
9
- subject{ described_class.new }
10
-
11
- include_context 'validator context' do
12
- let( :valid_model ){ model_class.new( customer_number: 12345 ) }
13
- end
14
-
15
- describe '.validate Invoice' do
16
- include_examples 'required attributes', Fortnox::API::Model::Invoice
17
-
18
- include_examples 'validates length of string', :address1, 1024
19
- include_examples 'validates length of string', :address2, 1024
20
- include_examples 'validates length of string', :customer_name, 1024
21
- include_examples 'validates length of string', :external_invoice_reference1, 80
22
- include_examples 'validates length of string', :external_invoice_reference2, 80
23
- include_examples 'validates length of string', :our_reference, 50
24
- include_examples 'validates length of string', :phone1, 1024
25
- include_examples 'validates length of string', :phone2, 1024
26
- include_examples 'validates length of string', :remarks, 1024
27
- include_examples 'validates length of string', :your_order_number, 30
28
- include_examples 'validates length of string', :your_reference, 50
29
- include_examples 'validates length of string', :zip_code, 1024
30
-
31
- include_examples 'validates inclusion of number', :administration_fee, 0, 99_999_999_999.0
32
- include_examples 'validates inclusion of number', :currency_rate, 0, 999_999_999_999_999.0
33
- include_examples 'validates inclusion of number', :currency_unit, 0, 999_999_999_999_999.0
34
- include_examples 'validates inclusion of number', :freight, 0, 99_999_999_999.0
35
- end
36
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
- require 'fortnox/api/validators/context'
3
- require 'fortnox/api/validators/row'
4
- require 'fortnox/api/models/row'
5
-
6
- describe Fortnox::API::Validator::Row do
7
- subject{ described_class.new }
8
-
9
- include_context 'validator context' do
10
- let( :valid_model ){ Fortnox::API::Model::Row.new }
11
- end
12
-
13
- describe '.validate Row' do
14
- context 'with required attributes' do
15
- it{ is_expected.to be_valid( valid_model ) }
16
- end
17
-
18
- include_examples 'validates length of string', :article_number, 50
19
- include_examples 'validates length of string', :description, 50
20
-
21
- include_examples 'validates inclusion of number', :account_number, 0, 9999
22
- include_examples 'validates inclusion of number', :delivered_quantity, 0, 9_999_999_999_999.0
23
- include_examples 'validates inclusion of number', :discount, 0, 99_999_999_999.0
24
- include_examples 'validates inclusion of number', :house_work_hours_to_report, 0, 99_999
25
- include_examples 'validates inclusion of number', :price, 0, 99_999_999_999.0
26
- end
27
- end
@@ -1,20 +0,0 @@
1
- shared_examples_for 'validators' do
2
-
3
- it{ is_expected.to respond_to( :validate ) }
4
- it{ is_expected.to respond_to( :violations ) }
5
- it{ is_expected.to respond_to( :instance ) }
6
-
7
- context 'when validator present' do
8
- specify '#violations returns an empty Set when no violations present' do
9
- expect(subject.violations).to eq(Set.new)
10
- end
11
-
12
- specify '#validate returns true when model valid' do
13
- expect(subject.validate( valid_model )).to be true
14
- end
15
-
16
- specify '#instance returns self' do
17
- expect(subject.instance).to be subject
18
- end
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- RSpec::Matchers.define :upcase_lower_case_for do |attribute, value|
2
- match do
3
- subject = new_model( attribute, value )
4
- expect( subject.send( attribute ) ).to eql( value.upcase )
5
- end
6
-
7
- failure_message do
8
- "expected #{subject.class} to upcase #{value} case for :#{attribute}"
9
- end
10
- end
11
-
12
- RSpec::Matchers.define :return_nil_for_invalid_types do |attribute, value|
13
- match do
14
- subject = new_model( attribute, value )
15
- expect( subject.send( attribute ) ).to eql( nil )
16
- end
17
-
18
- failure_message do
19
- "expected #{subject.class} to return nil when :#{attribute} is set to #{value}"
20
- end
21
- end
22
-
23
- private
24
-
25
- def new_model( attribute, value )
26
- described_class.new( attribute => value )
27
- end
@@ -1,36 +0,0 @@
1
- RSpec::Matchers.define :be_valid do |model|
2
- expect_validate( model, true )
3
- end
4
-
5
- RSpec::Matchers.define :be_invalid do |model|
6
- expect_validate( model, false )
7
- end
8
-
9
- RSpec::Matchers.define :include_error_for do |model, attribute, error_type|
10
- match do
11
- subject.validate( model )
12
- error_included = false
13
- subject.violations.any? do |v|
14
- if v.rule.attribute_name == attribute && v.rule.type == error_type
15
- error_included = true
16
- end
17
- end
18
- expect( error_included ).to eql( true )
19
- end
20
-
21
- description{ "include error for #{attribute}" }
22
-
23
- failure_message do
24
- "expected \"#{subject.violations.inspect}\" to include #{error_type} error for \"#{attribute}\""
25
- end
26
- end
27
-
28
- private
29
-
30
- def expect_validate( model, expected )
31
- match{ expect( subject.validate( model ) ).to eq( expected ) }
32
-
33
- description{ "validate #{expected}" }
34
-
35
- failure_message{ "expected validator to validate #{expected}" }
36
- end