shoulda-matchers 3.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (288) hide show
  1. checksums.yaml +5 -5
  2. data/{MIT-LICENSE → LICENSE} +1 -1
  3. data/README.md +407 -232
  4. data/docs/errors/NonCaseSwappableValueError.md +2 -2
  5. data/lib/shoulda/matchers/action_controller/callback_matcher.rb +7 -80
  6. data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +4 -3
  7. data/lib/shoulda/matchers/action_controller/flash_store.rb +2 -4
  8. data/lib/shoulda/matchers/action_controller/permit_matcher.rb +36 -30
  9. data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +8 -10
  10. data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +7 -9
  11. data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +18 -15
  12. data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +3 -2
  13. data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +3 -3
  14. data/lib/shoulda/matchers/action_controller/route_matcher.rb +88 -29
  15. data/lib/shoulda/matchers/action_controller/route_params.rb +2 -2
  16. data/lib/shoulda/matchers/action_controller/set_flash_matcher.rb +4 -4
  17. data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -3
  18. data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +19 -13
  19. data/lib/shoulda/matchers/action_controller.rb +2 -0
  20. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +1 -1
  21. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +5 -9
  22. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +2 -2
  23. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +1 -1
  24. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +1 -1
  25. data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +42 -39
  26. data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +1 -1
  27. data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +52 -26
  28. data/lib/shoulda/matchers/active_model/helpers.rb +2 -2
  29. data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -30
  30. data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +2 -1
  31. data/lib/shoulda/matchers/active_model/qualifiers/allow_blank.rb +26 -0
  32. data/lib/shoulda/matchers/active_model/qualifiers/allow_nil.rb +26 -0
  33. data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +1 -1
  34. data/lib/shoulda/matchers/active_model/qualifiers.rb +2 -0
  35. data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +30 -6
  36. data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +8 -3
  37. data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +31 -16
  38. data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +52 -16
  39. data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +137 -84
  40. data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +159 -46
  41. data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +130 -66
  42. data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +251 -24
  43. data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +12 -9
  44. data/lib/shoulda/matchers/active_model/validation_matcher.rb +38 -6
  45. data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -4
  46. data/lib/shoulda/matchers/active_model/validator.rb +4 -9
  47. data/lib/shoulda/matchers/active_model.rb +3 -5
  48. data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +10 -7
  49. data/lib/shoulda/matchers/active_record/association_matcher.rb +386 -111
  50. data/lib/shoulda/matchers/active_record/association_matchers/counter_cache_matcher.rb +5 -2
  51. data/lib/shoulda/matchers/active_record/association_matchers/dependent_matcher.rb +4 -4
  52. data/lib/shoulda/matchers/active_record/association_matchers/inverse_of_matcher.rb +1 -1
  53. data/lib/shoulda/matchers/active_record/association_matchers/join_table_matcher.rb +11 -6
  54. data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +14 -15
  55. data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +30 -8
  56. data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +34 -11
  57. data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +69 -0
  58. data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +1 -1
  59. data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +74 -0
  60. data/lib/shoulda/matchers/active_record/association_matchers/source_matcher.rb +3 -2
  61. data/lib/shoulda/matchers/active_record/association_matchers/through_matcher.rb +7 -5
  62. data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +458 -42
  63. data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +185 -0
  64. data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +63 -23
  65. data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +164 -48
  66. data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +106 -0
  67. data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +13 -11
  68. data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +83 -0
  69. data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +132 -0
  70. data/lib/shoulda/matchers/active_record/serialize_matcher.rb +18 -18
  71. data/lib/shoulda/matchers/active_record/uniqueness/test_model_creator.rb +1 -3
  72. data/lib/shoulda/matchers/active_record/uniqueness/test_models.rb +0 -2
  73. data/lib/shoulda/matchers/active_record/uniqueness.rb +1 -1
  74. data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +430 -200
  75. data/lib/shoulda/matchers/active_record.rb +28 -20
  76. data/lib/shoulda/matchers/configuration.rb +12 -1
  77. data/lib/shoulda/matchers/doublespeak/double.rb +1 -1
  78. data/lib/shoulda/matchers/doublespeak/double_collection.rb +3 -3
  79. data/lib/shoulda/matchers/doublespeak/double_implementation_registry.rb +8 -5
  80. data/lib/shoulda/matchers/doublespeak/object_double.rb +6 -2
  81. data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +1 -5
  82. data/lib/shoulda/matchers/doublespeak/world.rb +2 -2
  83. data/lib/shoulda/matchers/doublespeak.rb +2 -1
  84. data/lib/shoulda/matchers/error.rb +1 -1
  85. data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +109 -29
  86. data/lib/shoulda/matchers/independent.rb +2 -2
  87. data/lib/shoulda/matchers/integrations/configuration.rb +8 -4
  88. data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +1 -1
  89. data/lib/shoulda/matchers/integrations/libraries/rails.rb +2 -2
  90. data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +1 -1
  91. data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +1 -1
  92. data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +1 -1
  93. data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +1 -1
  94. data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +1 -1
  95. data/lib/shoulda/matchers/rails_shim.rb +172 -51
  96. data/lib/shoulda/matchers/routing.rb +2 -2
  97. data/lib/shoulda/matchers/util/word_wrap.rb +17 -12
  98. data/lib/shoulda/matchers/util.rb +39 -5
  99. data/lib/shoulda/matchers/version.rb +1 -1
  100. data/lib/shoulda/matchers/warn.rb +4 -3
  101. data/shoulda-matchers.gemspec +33 -15
  102. metadata +31 -338
  103. data/.gitignore +0 -12
  104. data/.hound.yml +0 -3
  105. data/.hound_config/ruby.yml +0 -12
  106. data/.travis.yml +0 -19
  107. data/.yardopts +0 -10
  108. data/Appraisals +0 -73
  109. data/CONTRIBUTING.md +0 -101
  110. data/Gemfile +0 -15
  111. data/Gemfile.lock +0 -70
  112. data/NEWS.md +0 -986
  113. data/Rakefile +0 -39
  114. data/custom_plan.rb +0 -88
  115. data/doc_config/gh-pages/index.html.erb +0 -9
  116. data/doc_config/yard/setup.rb +0 -22
  117. data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +0 -5967
  118. data/doc_config/yard/templates/default/fulldoc/html/css/full_list.css +0 -12
  119. data/doc_config/yard/templates/default/fulldoc/html/css/global.css +0 -62
  120. data/doc_config/yard/templates/default/fulldoc/html/css/solarized.css +0 -69
  121. data/doc_config/yard/templates/default/fulldoc/html/css/style.css +0 -312
  122. data/doc_config/yard/templates/default/fulldoc/html/full_list.erb +0 -32
  123. data/doc_config/yard/templates/default/fulldoc/html/full_list_class.erb +0 -1
  124. data/doc_config/yard/templates/default/fulldoc/html/full_list_method.erb +0 -8
  125. data/doc_config/yard/templates/default/fulldoc/html/js/app.js +0 -298
  126. data/doc_config/yard/templates/default/fulldoc/html/js/full_list.js +0 -1
  127. data/doc_config/yard/templates/default/fulldoc/html/js/jquery.stickyheaders.js +0 -289
  128. data/doc_config/yard/templates/default/fulldoc/html/js/underscore.min.js +0 -6
  129. data/doc_config/yard/templates/default/fulldoc/html/setup.rb +0 -8
  130. data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +0 -14
  131. data/doc_config/yard/templates/default/layout/html/fonts.erb +0 -1
  132. data/doc_config/yard/templates/default/layout/html/footer.erb +0 -6
  133. data/doc_config/yard/templates/default/layout/html/layout.erb +0 -23
  134. data/doc_config/yard/templates/default/layout/html/search.erb +0 -13
  135. data/doc_config/yard/templates/default/layout/html/setup.rb +0 -40
  136. data/doc_config/yard/templates/default/method_details/html/source.erb +0 -10
  137. data/doc_config/yard/templates/default/module/html/box_info.erb +0 -31
  138. data/gemfiles/4.0.0.gemfile +0 -38
  139. data/gemfiles/4.0.0.gemfile.lock +0 -223
  140. data/gemfiles/4.0.1.gemfile +0 -38
  141. data/gemfiles/4.0.1.gemfile.lock +0 -225
  142. data/gemfiles/4.1.gemfile +0 -38
  143. data/gemfiles/4.1.gemfile.lock +0 -220
  144. data/gemfiles/4.2.gemfile +0 -38
  145. data/gemfiles/4.2.gemfile.lock +0 -243
  146. data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +0 -159
  147. data/lib/shoulda/matchers/independent/delegate_method_matcher/stubbed_target.rb +0 -37
  148. data/script/SUPPORTED_VERSIONS +0 -1
  149. data/script/install_gems_in_all_appraisals +0 -14
  150. data/script/run_all_tests +0 -14
  151. data/script/update_gem_in_all_appraisals +0 -15
  152. data/script/update_gems_in_all_appraisals +0 -14
  153. data/spec/acceptance/active_model_integration_spec.rb +0 -23
  154. data/spec/acceptance/independent_matchers_spec.rb +0 -125
  155. data/spec/acceptance/multiple_libraries_integration_spec.rb +0 -55
  156. data/spec/acceptance/rails_integration_spec.rb +0 -156
  157. data/spec/acceptance_spec_helper.rb +0 -23
  158. data/spec/doublespeak_spec_helper.rb +0 -2
  159. data/spec/report_warnings.rb +0 -7
  160. data/spec/spec_helper.rb +0 -21
  161. data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +0 -133
  162. data/spec/support/acceptance/helpers/active_model_helpers.rb +0 -11
  163. data/spec/support/acceptance/helpers/array_helpers.rb +0 -13
  164. data/spec/support/acceptance/helpers/base_helpers.rb +0 -19
  165. data/spec/support/acceptance/helpers/command_helpers.rb +0 -55
  166. data/spec/support/acceptance/helpers/file_helpers.rb +0 -19
  167. data/spec/support/acceptance/helpers/gem_helpers.rb +0 -31
  168. data/spec/support/acceptance/helpers/minitest_helpers.rb +0 -11
  169. data/spec/support/acceptance/helpers/n_unit_helpers.rb +0 -25
  170. data/spec/support/acceptance/helpers/pluralization_helpers.rb +0 -13
  171. data/spec/support/acceptance/helpers/rails_version_helpers.rb +0 -11
  172. data/spec/support/acceptance/helpers/rspec_helpers.rb +0 -24
  173. data/spec/support/acceptance/helpers/ruby_version_helpers.rb +0 -9
  174. data/spec/support/acceptance/helpers/step_helpers.rb +0 -127
  175. data/spec/support/acceptance/helpers.rb +0 -31
  176. data/spec/support/acceptance/matchers/have_output.rb +0 -31
  177. data/spec/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +0 -55
  178. data/spec/support/acceptance/matchers/indicate_that_tests_were_run_matcher.rb +0 -103
  179. data/spec/support/tests/bundle.rb +0 -94
  180. data/spec/support/tests/command_runner.rb +0 -230
  181. data/spec/support/tests/current_bundle.rb +0 -61
  182. data/spec/support/tests/database.rb +0 -28
  183. data/spec/support/tests/database_adapters/postgresql.rb +0 -25
  184. data/spec/support/tests/database_adapters/sqlite3.rb +0 -26
  185. data/spec/support/tests/database_configuration.rb +0 -33
  186. data/spec/support/tests/database_configuration_registry.rb +0 -28
  187. data/spec/support/tests/filesystem.rb +0 -100
  188. data/spec/support/tests/version.rb +0 -45
  189. data/spec/support/unit/active_record/create_table.rb +0 -54
  190. data/spec/support/unit/attribute.rb +0 -47
  191. data/spec/support/unit/capture.rb +0 -40
  192. data/spec/support/unit/change_value.rb +0 -111
  193. data/spec/support/unit/create_model_arguments/basic.rb +0 -135
  194. data/spec/support/unit/create_model_arguments/has_many.rb +0 -15
  195. data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +0 -74
  196. data/spec/support/unit/helpers/active_model_helpers.rb +0 -27
  197. data/spec/support/unit/helpers/active_model_versions.rb +0 -28
  198. data/spec/support/unit/helpers/active_record_versions.rb +0 -24
  199. data/spec/support/unit/helpers/active_resource_builder.rb +0 -27
  200. data/spec/support/unit/helpers/allow_value_matcher_helpers.rb +0 -15
  201. data/spec/support/unit/helpers/class_builder.rb +0 -90
  202. data/spec/support/unit/helpers/column_type_helpers.rb +0 -26
  203. data/spec/support/unit/helpers/confirmation_matcher_helpers.rb +0 -17
  204. data/spec/support/unit/helpers/controller_builder.rb +0 -63
  205. data/spec/support/unit/helpers/database_helpers.rb +0 -20
  206. data/spec/support/unit/helpers/i18n_faker.rb +0 -15
  207. data/spec/support/unit/helpers/mailer_builder.rb +0 -12
  208. data/spec/support/unit/helpers/model_builder.rb +0 -114
  209. data/spec/support/unit/helpers/rails_versions.rb +0 -28
  210. data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +0 -44
  211. data/spec/support/unit/i18n.rb +0 -7
  212. data/spec/support/unit/load_environment.rb +0 -12
  213. data/spec/support/unit/matchers/deprecate.rb +0 -60
  214. data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +0 -51
  215. data/spec/support/unit/matchers/fail_with_message_matcher.rb +0 -62
  216. data/spec/support/unit/matchers/print_warning_including.rb +0 -59
  217. data/spec/support/unit/model_creation_strategies/active_model.rb +0 -111
  218. data/spec/support/unit/model_creation_strategies/active_record.rb +0 -77
  219. data/spec/support/unit/model_creators/active_model.rb +0 -39
  220. data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +0 -95
  221. data/spec/support/unit/model_creators/active_record/has_many.rb +0 -67
  222. data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +0 -42
  223. data/spec/support/unit/model_creators/active_record.rb +0 -43
  224. data/spec/support/unit/model_creators/basic.rb +0 -97
  225. data/spec/support/unit/model_creators.rb +0 -19
  226. data/spec/support/unit/rails_application.rb +0 -126
  227. data/spec/support/unit/record_builder_with_i18n_validation_message.rb +0 -69
  228. data/spec/support/unit/record_validating_confirmation_builder.rb +0 -51
  229. data/spec/support/unit/record_with_different_error_attribute_builder.rb +0 -92
  230. data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +0 -79
  231. data/spec/support/unit/shared_examples/numerical_submatcher.rb +0 -17
  232. data/spec/support/unit/shared_examples/set_session_or_flash.rb +0 -360
  233. data/spec/support/unit/validation_matcher_scenario.rb +0 -62
  234. data/spec/unit/shoulda/matchers/action_controller/callback_matcher_spec.rb +0 -82
  235. data/spec/unit/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +0 -28
  236. data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +0 -592
  237. data/spec/unit/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +0 -42
  238. data/spec/unit/shoulda/matchers/action_controller/render_template_matcher_spec.rb +0 -76
  239. data/spec/unit/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +0 -62
  240. data/spec/unit/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +0 -90
  241. data/spec/unit/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +0 -31
  242. data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +0 -330
  243. data/spec/unit/shoulda/matchers/action_controller/route_params_spec.rb +0 -30
  244. data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +0 -67
  245. data/spec/unit/shoulda/matchers/action_controller/set_session_matcher_spec.rb +0 -17
  246. data/spec/unit/shoulda/matchers/action_controller/set_session_or_flash_matcher_spec.rb +0 -562
  247. data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
  248. data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +0 -823
  249. data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +0 -86
  250. data/spec/unit/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +0 -20
  251. data/spec/unit/shoulda/matchers/active_model/helpers_spec.rb +0 -162
  252. data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +0 -266
  253. data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +0 -91
  254. data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +0 -149
  255. data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +0 -207
  256. data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +0 -1015
  257. data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +0 -288
  258. data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +0 -1837
  259. data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +0 -380
  260. data/spec/unit/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -107
  261. data/spec/unit/shoulda/matchers/active_record/association_matcher_spec.rb +0 -1242
  262. data/spec/unit/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +0 -251
  263. data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +0 -168
  264. data/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +0 -111
  265. data/spec/unit/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +0 -85
  266. data/spec/unit/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +0 -41
  267. data/spec/unit/shoulda/matchers/active_record/serialize_matcher_spec.rb +0 -86
  268. data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +0 -1418
  269. data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +0 -190
  270. data/spec/unit/shoulda/matchers/doublespeak/double_implementation_registry_spec.rb +0 -21
  271. data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +0 -271
  272. data/spec/unit/shoulda/matchers/doublespeak/object_double_spec.rb +0 -77
  273. data/spec/unit/shoulda/matchers/doublespeak/proxy_implementation_spec.rb +0 -72
  274. data/spec/unit/shoulda/matchers/doublespeak/stub_implementation_spec.rb +0 -101
  275. data/spec/unit/shoulda/matchers/doublespeak/world_spec.rb +0 -80
  276. data/spec/unit/shoulda/matchers/doublespeak_spec.rb +0 -27
  277. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher/stubbed_target_spec.rb +0 -43
  278. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher_spec.rb +0 -517
  279. data/spec/unit/shoulda/matchers/routing/route_matcher_spec.rb +0 -242
  280. data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +0 -252
  281. data/spec/unit_spec_helper.rb +0 -46
  282. data/spec/warnings_spy/filesystem.rb +0 -45
  283. data/spec/warnings_spy/partitioner.rb +0 -36
  284. data/spec/warnings_spy/reader.rb +0 -53
  285. data/spec/warnings_spy/reporter.rb +0 -88
  286. data/spec/warnings_spy.rb +0 -64
  287. data/tasks/documentation.rb +0 -199
  288. data/zeus.json +0 -11
@@ -1,823 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel, type: :model do
4
- describe '#allow_values' do
5
- it 'is aliased to #allow_value' do
6
- expect(method(:allow_values)).to eq(method(:allow_value))
7
- end
8
- end
9
- end
10
-
11
- describe Shoulda::Matchers::ActiveModel::AllowValueMatcher, type: :model do
12
- context "#description" do
13
- it 'describes itself with multiple values' do
14
- matcher = allow_value('foo', 'bar').for(:baz)
15
-
16
- expect(matcher.description).to eq(
17
- 'allow :baz to be ‹"foo"› or ‹"bar"›'
18
- )
19
- end
20
-
21
- it 'describes itself with a single value' do
22
- matcher = allow_value('foo').for(:baz)
23
-
24
- expect(matcher.description).to eq 'allow :baz to be ‹"foo"›'
25
- end
26
-
27
- if active_model_3_2?
28
- it 'describes itself with a strict validation' do
29
- strict_matcher = allow_value('xyz').for(:attr).strict
30
-
31
- expect(strict_matcher.description).to eq(
32
- 'allow :attr to be ‹"xyz"›, raising a validation exception on failure'
33
- )
34
- end
35
- end
36
- end
37
-
38
- describe '#_after_setting_value' do
39
- it 'sets a block which is yielded after each value is set on the attribute' do
40
- attribute = :attr
41
- record = define_model(:example, attribute => :string).new
42
- matcher = described_class.new('a', 'b', 'c').for(attribute)
43
- call_count = 0
44
-
45
- matcher._after_setting_value { call_count += 1 }
46
- matcher.matches?(record)
47
-
48
- expect(call_count).to eq 3
49
- end
50
- end
51
-
52
- context 'an attribute with a validation' do
53
- context 'given one good value' do
54
- context 'when used in the positive' do
55
- it 'accepts' do
56
- expect(validating_format(with: /abc/)).
57
- to allow_value('abcde').for(:attr)
58
- end
59
- end
60
-
61
- context 'when used in the negative' do
62
- it 'rejects with an appropriate failure message' do
63
- assertion = lambda do
64
- expect(validating_format(with: /abc/)).
65
- not_to allow_value('abcde').for(:attr)
66
- end
67
-
68
- message = <<-MESSAGE
69
- After setting :attr to ‹"abcde"›, the matcher expected the Example to be
70
- invalid, but it was valid instead.
71
- MESSAGE
72
-
73
- expect(&assertion).to fail_with_message(message)
74
- end
75
- end
76
- end
77
-
78
- context 'given several good values' do
79
- context 'when used in the positive' do
80
- it 'accepts' do
81
- expect(validating_format(with: /abc/)).
82
- to allow_value('abcde', 'deabc').for(:attr)
83
- end
84
- end
85
-
86
- context 'when used in the negative' do
87
- it 'rejects with an appropriate failure message' do
88
- assertion = lambda do
89
- expect(validating_format(with: /abc/)).
90
- not_to allow_value('abcde', 'deabc').for(:attr)
91
- end
92
-
93
- message = <<-MESSAGE
94
- After setting :attr to ‹"abcde"›, the matcher expected the Example to be
95
- invalid, but it was valid instead.
96
- MESSAGE
97
-
98
- expect(&assertion).to fail_with_message(message)
99
- end
100
- end
101
- end
102
-
103
- context 'given one bad value' do
104
- context 'when used in the positive' do
105
- it 'rejects with an appropriate failure message' do
106
- assertion = lambda do
107
- expect(validating_format(with: /abc/)).
108
- to allow_value('xyz').for(:attr)
109
- end
110
-
111
- message = <<-MESSAGE
112
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
113
- valid, but it was invalid instead, producing these validation errors:
114
-
115
- * attr: ["is invalid"]
116
- MESSAGE
117
-
118
- expect(&assertion).to fail_with_message(message)
119
- end
120
- end
121
-
122
- context 'when used in the negative' do
123
- it 'accepts' do
124
- expect(validating_format(with: /abc/)).
125
- not_to allow_value('xyz').for(:attr)
126
- end
127
- end
128
- end
129
-
130
- context 'given several bad values' do
131
- context 'when used in the positive' do
132
- it 'rejects with an appropriate failure message' do
133
- assertion = lambda do
134
- expect(validating_format(with: /abc/)).
135
- to allow_value('xyz', 'zyx', nil, []).
136
- for(:attr).
137
- ignoring_interference_by_writer
138
- end
139
-
140
- message = <<-MESSAGE
141
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
142
- valid, but it was invalid instead, producing these validation errors:
143
-
144
- * attr: ["is invalid"]
145
- MESSAGE
146
-
147
- expect(&assertion).to fail_with_message(message)
148
- end
149
- end
150
-
151
- context 'when used in the negative' do
152
- it 'accepts' do
153
- expect(validating_format(with: /abc/)).
154
- not_to allow_value('xyz', 'zyx', nil, []).
155
- for(:attr).
156
- ignoring_interference_by_writer
157
- end
158
- end
159
- end
160
-
161
- context 'given good values along with bad values' do
162
- context 'when used in the positive' do
163
- it 'rejects with an appropriate failure message' do
164
- assertion = lambda do
165
- expect(validating_format(with: /abc/)).
166
- to allow_value('abc', 'xyz').
167
- for(:attr).
168
- ignoring_interference_by_writer
169
- end
170
-
171
- message = <<-MESSAGE
172
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
173
- valid, but it was invalid instead, producing these validation errors:
174
-
175
- * attr: ["is invalid"]
176
- MESSAGE
177
-
178
- expect(&assertion).to fail_with_message(message)
179
- end
180
- end
181
-
182
- context 'when used in the negative' do
183
- it 'rejects with an appropriate failure message' do
184
- assertion = lambda do
185
- expect(validating_format(with: /abc/)).
186
- not_to allow_value('abc', 'xyz').
187
- for(:attr).
188
- ignoring_interference_by_writer
189
- end
190
-
191
- message = <<-MESSAGE
192
- After setting :attr to ‹"abc"›, the matcher expected the Example to be
193
- invalid, but it was valid instead.
194
- MESSAGE
195
-
196
- expect(&assertion).to fail_with_message(message)
197
- end
198
- end
199
- end
200
-
201
- context 'given bad values along with good values' do
202
- context 'when used in the positive' do
203
- it 'rejects with an appropriate failure message' do
204
- assertion = lambda do
205
- expect(validating_format(with: /abc/)).
206
- to allow_value('xyz', 'abc').
207
- for(:attr).
208
- ignoring_interference_by_writer
209
- end
210
-
211
- message = <<-MESSAGE
212
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
213
- valid, but it was invalid instead, producing these validation errors:
214
-
215
- * attr: ["is invalid"]
216
- MESSAGE
217
-
218
- expect(&assertion).to fail_with_message(message)
219
- end
220
- end
221
-
222
- context 'when used in the negative' do
223
- it 'rejects with an appropriate failure message' do
224
- assertion = lambda do
225
- expect(validating_format(with: /abc/)).
226
- not_to allow_value('xyz', 'abc').
227
- for(:attr).
228
- ignoring_interference_by_writer
229
- end
230
-
231
- message = <<-MESSAGE
232
- After setting :attr to ‹"abc"›, the matcher expected the Example to be
233
- invalid, but it was valid instead.
234
- MESSAGE
235
-
236
- expect(&assertion).to fail_with_message(message)
237
- end
238
- end
239
- end
240
- end
241
-
242
- context 'an attribute with a validation and a custom message' do
243
- it 'allows a good value' do
244
- expect(validating_format(with: /abc/, message: 'bad value')).
245
- to allow_value('abcde').for(:attr).with_message(/bad/)
246
- end
247
-
248
- it 'rejects a bad value with an appropriate failure message' do
249
- message = <<-MESSAGE
250
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
251
- valid, but it was invalid instead, producing these validation errors:
252
-
253
- * attr: ["bad value"]
254
- MESSAGE
255
-
256
- assertion = lambda do
257
- expect(validating_format(with: /abc/, message: 'bad value')).
258
- to allow_value('xyz').for(:attr).with_message(/bad/)
259
- end
260
-
261
- expect(&assertion).to fail_with_message(message)
262
- end
263
-
264
- context 'when the custom messages do not match' do
265
- it 'rejects with an appropriate failure message' do
266
- message = <<-MESSAGE
267
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
268
- invalid and to produce a validation error matching ‹/different/› on
269
- :attr. The record was indeed invalid, but it produced these validation
270
- errors instead:
271
-
272
- * attr: ["bad value"]
273
- MESSAGE
274
-
275
- assertion = lambda do
276
- expect(validating_format(with: /abc/, message: 'bad value')).
277
- not_to allow_value('xyz').for(:attr).with_message(/different/)
278
- end
279
-
280
- expect(&assertion).to fail_with_message(message)
281
- end
282
- end
283
-
284
- context 'when interpolation values are provided along with a custom message' do
285
- context 'when the messages match' do
286
- it 'accepts' do
287
- options = {
288
- attribute_name: :attr,
289
- attribute_type: :string
290
- }
291
-
292
- record = record_with_custom_validation(options) do
293
- if self.attr == 'xyz'
294
- self.errors.add :attr, :greater_than, count: 2
295
- end
296
- end
297
-
298
- expect(record).
299
- not_to allow_value('xyz').
300
- for(:attr).
301
- with_message(:greater_than, values: { count: 2 })
302
- end
303
- end
304
-
305
- context 'when the messages do not match' do
306
- it 'rejects with an appropriate failure message' do
307
- options = {
308
- attribute_name: :attr,
309
- attribute_type: :string
310
- }
311
-
312
- record = record_with_custom_validation(options) do
313
- if self.attr == 'xyz'
314
- self.errors.add :attr, "some other error"
315
- end
316
- end
317
-
318
- assertion = lambda do
319
- expect(record).
320
- not_to allow_value('xyz').
321
- for(:attr).
322
- with_message(:greater_than, values: { count: 2 })
323
- end
324
-
325
- message = <<-MESSAGE
326
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
327
- invalid and to produce the validation error "must be greater than 2" on
328
- :attr. The record was indeed invalid, but it produced these validation
329
- errors instead:
330
-
331
- * attr: ["some other error"]
332
- MESSAGE
333
-
334
- expect(&assertion).to fail_with_message(message)
335
- end
336
- end
337
- end
338
- end
339
-
340
- context 'when the attribute being validated is different than the attribute that receives the validation error' do
341
- include UnitTests::AllowValueMatcherHelpers
342
-
343
- context 'when the validation error message was provided directly' do
344
- context 'given a valid value' do
345
- it 'accepts' do
346
- builder = builder_for_record_with_different_error_attribute
347
- expect(builder.record).
348
- to allow_value(builder.valid_value).
349
- for(builder.attribute_to_validate).
350
- with_message(
351
- builder.message,
352
- against: builder.attribute_that_receives_error
353
- )
354
- end
355
- end
356
-
357
- context 'given an invalid value' do
358
- it 'rejects' do
359
- builder = builder_for_record_with_different_error_attribute
360
- invalid_value = "#{builder.valid_value} (invalid)"
361
-
362
- expect(builder.record).
363
- not_to allow_value(invalid_value).
364
- for(builder.attribute_to_validate).
365
- with_message(
366
- builder.message,
367
- against: builder.attribute_that_receives_error
368
- )
369
- end
370
-
371
- context 'if the messages do not match' do
372
- it 'technically accepts' do
373
- builder = builder_for_record_with_different_error_attribute(
374
- message: "a different error"
375
- )
376
- invalid_value = "#{builder.valid_value} (invalid)"
377
-
378
- assertion = lambda do
379
- expect(builder.record).
380
- not_to allow_value(invalid_value).
381
- for(builder.attribute_to_validate).
382
- with_message(
383
- "some error",
384
- against: builder.attribute_that_receives_error
385
- )
386
- end
387
-
388
- message = <<-MESSAGE
389
- After setting :#{builder.attribute_to_validate} to ‹"#{invalid_value}"›, the
390
- matcher expected the #{builder.model.name} to be invalid and to produce the validation
391
- error "some error" on :#{builder.attribute_that_receives_error}. The record was
392
- indeed invalid, but it produced these validation errors instead:
393
-
394
- * #{builder.attribute_that_receives_error}: ["a different error"]
395
- MESSAGE
396
-
397
- expect(&assertion).to fail_with_message(message)
398
- end
399
- end
400
- end
401
- end
402
-
403
- context 'when the validation error message was provided via i18n' do
404
- it 'passes given a valid value' do
405
- builder = builder_for_record_with_different_error_attribute_using_i18n
406
- expect(builder.record).
407
- to allow_value(builder.valid_value).
408
- for(builder.attribute_to_validate).
409
- with_message(
410
- builder.validation_message_key,
411
- against: builder.attribute_that_receives_error
412
- )
413
- end
414
-
415
- it 'fails given an invalid value' do
416
- builder = builder_for_record_with_different_error_attribute_using_i18n
417
- invalid_value = "#{builder.valid_value} (invalid)"
418
- expect(builder.record).
419
- not_to allow_value(invalid_value).
420
- for(builder.attribute_to_validate).
421
- with_message(
422
- builder.validation_message_key,
423
- against: builder.attribute_that_receives_error
424
- )
425
- end
426
- end
427
- end
428
-
429
- context "an attribute with a context-dependent validation" do
430
- context "without the validation context" do
431
- it "allows a bad value" do
432
- expect(validating_format(with: /abc/, on: :customisable)).to allow_value("xyz").for(:attr)
433
- end
434
- end
435
-
436
- context "with the validation context" do
437
- it "allows a good value" do
438
- expect(validating_format(with: /abc/, on: :customisable)).to allow_value("abcde").for(:attr).on(:customisable)
439
- end
440
-
441
- it "rejects a bad value" do
442
- expect(validating_format(with: /abc/, on: :customisable)).not_to allow_value("xyz").for(:attr).on(:customisable)
443
- end
444
- end
445
- end
446
-
447
- context 'an attribute with several validations' do
448
- let(:model) do
449
- define_model :example, attr: :string do
450
- validates_presence_of :attr
451
- validates_length_of :attr, within: 1..5
452
- validates_numericality_of :attr, greater_than_or_equal_to: 1,
453
- less_than_or_equal_to: 50000
454
- end.new
455
- end
456
-
457
- bad_values = [nil, '', 'abc', '0', '50001', '123456', []]
458
-
459
- it 'matches given a good value' do
460
- expect(model).to allow_value('12345').for(:attr)
461
- end
462
-
463
- it 'does not match given a bad value' do
464
- bad_values.each do |bad_value|
465
- expect(model).
466
- not_to allow_value(bad_value).
467
- for(:attr).
468
- ignoring_interference_by_writer
469
- end
470
- end
471
-
472
- it 'does not match given multiple bad values' do
473
- expect(model).
474
- not_to allow_value(*bad_values).
475
- for(:attr).
476
- ignoring_interference_by_writer
477
- end
478
-
479
- it "does not match given good values along with bad values" do
480
- message = <<-MESSAGE.strip_heredoc
481
- After setting :attr to ‹"12345"›, the matcher expected the Example to be
482
- invalid, but it was valid instead.
483
- MESSAGE
484
-
485
- assertion = lambda do
486
- expect(model).not_to allow_value('12345', *bad_values).for(:attr)
487
- end
488
-
489
- expect(&assertion).to fail_with_message(message)
490
- end
491
-
492
- it "does not match given bad values along with good values" do
493
- message = <<-MESSAGE.strip_heredoc
494
- After setting :attr to ‹"12345"›, the matcher expected the Example to be
495
- invalid, but it was valid instead.
496
- MESSAGE
497
-
498
- assertion = lambda do
499
- expect(model).not_to allow_value(*bad_values, '12345').for(:attr)
500
- end
501
-
502
- expect(&assertion).to fail_with_message(message)
503
- end
504
- end
505
-
506
- context 'with a single value' do
507
- it 'allows you to call description before calling matches?' do
508
- model = define_model(:example, attr: :string).new
509
- matcher = described_class.new('foo').for(:attr)
510
- matcher.description
511
-
512
- expect { matcher.matches?(model) }.not_to raise_error
513
- end
514
- end
515
-
516
- context 'with no values' do
517
- it 'raises an error' do
518
- expect { allow_value.for(:baz) }.
519
- to raise_error(ArgumentError, /at least one argument/)
520
- end
521
- end
522
-
523
- if active_model_3_2?
524
- context 'an attribute with a strict format validation' do
525
- context 'when qualified with strict' do
526
- it 'rejects a bad value, providing the correct failure message' do
527
- message = <<-MESSAGE.strip_heredoc
528
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
529
- valid, but it was invalid instead, raising a validation exception with
530
- the message "Attr is invalid".
531
- MESSAGE
532
-
533
- assertion = lambda do
534
- expect(validating_format(with: /abc/, strict: true)).
535
- to allow_value('xyz').for(:attr).strict
536
- end
537
-
538
- expect(&assertion).to fail_with_message(message)
539
- end
540
-
541
- context 'qualified with a custom message' do
542
- it 'rejects a bad value when the failure messages do not match' do
543
- message = <<-MESSAGE.strip_heredoc
544
- After setting :attr to ‹"xyz"›, the matcher expected the Example to be
545
- invalid and to raise a validation exception with message matching
546
- ‹/abc/›. The record was indeed invalid, but the exception message was
547
- "Attr is invalid" instead.
548
- MESSAGE
549
-
550
- assertion = lambda do
551
- expect(validating_format(with: /abc/, strict: true)).
552
- not_to allow_value('xyz').for(:attr).with_message(/abc/).strict
553
- end
554
-
555
- expect(&assertion).to fail_with_message(message)
556
- end
557
- end
558
- end
559
- end
560
- end
561
-
562
- context 'when the attribute interferes with attempts to be set' do
563
- context 'when the attribute cannot be changed from nil to non-nil' do
564
- context 'and the record remains valid' do
565
- it 'accepts (and does not raise an AttributeChangedValueError)' do
566
- model = define_active_model_class 'Example', accessors: [:name] do
567
- def name=(_value)
568
- nil
569
- end
570
- end
571
-
572
- expect(model.new).to allow_value('anything').for(:name)
573
- end
574
- end
575
-
576
- context 'and the record becomes invalid' do
577
- it 'rejects with an appropriate failure message' do
578
- model = define_active_model_class 'Example', accessors: [:name] do
579
- validates_presence_of :name
580
-
581
- def name=(_value)
582
- nil
583
- end
584
- end
585
-
586
- assertion = lambda do
587
- expect(model.new).to allow_value('anything').for(:name)
588
- end
589
-
590
- message = <<-MESSAGE.strip
591
- After setting :name to ‹"anything"› -- which was read back as ‹nil› --
592
- the matcher expected the Example to be valid, but it was invalid
593
- instead, producing these validation errors:
594
-
595
- * name: ["can't be blank"]
596
-
597
- As indicated in the message above, :name seems to be changing certain
598
- values as they are set, and this could have something to do with why
599
- this test is failing. If you've overridden the writer method for this
600
- attribute, then you may need to change it to make this test pass, or do
601
- something else entirely.
602
- MESSAGE
603
-
604
- expect(&assertion).to fail_with_message(message)
605
- end
606
- end
607
- end
608
-
609
- context 'when the attribute cannot be changed from non-nil to nil' do
610
- context 'and the record remains valid' do
611
- it 'accepts (and does not raise an AttributeChangedValueError)' do
612
- model = define_active_model_class 'Example', accessors: [:name] do
613
- def name=(value)
614
- if value
615
- super(value)
616
- end
617
- end
618
- end
619
-
620
- record = model.new(name: 'some name')
621
-
622
- expect(record).to allow_value(nil).for(:name)
623
- end
624
- end
625
-
626
- context 'and the record becomes invalid' do
627
- it 'rejects with an appropriate failure message' do
628
- model = define_active_model_class 'Example', accessors: [:name] do
629
- validates_absence_of :name
630
-
631
- def name=(value)
632
- if value
633
- super(value)
634
- end
635
- end
636
- end
637
-
638
- record = model.new(name: 'some name')
639
-
640
- assertion = lambda do
641
- expect(record).to allow_value(nil).for(:name)
642
- end
643
-
644
- message = <<-MESSAGE.strip
645
- After setting :name to ‹nil› -- which was read back as ‹"some name"› --
646
- the matcher expected the Example to be valid, but it was invalid
647
- instead, producing these validation errors:
648
-
649
- * name: ["must be blank"]
650
-
651
- As indicated in the message above, :name seems to be changing certain
652
- values as they are set, and this could have something to do with why
653
- this test is failing. If you've overridden the writer method for this
654
- attribute, then you may need to change it to make this test pass, or do
655
- something else entirely.
656
- MESSAGE
657
-
658
- expect(&assertion).to fail_with_message(message)
659
- end
660
- end
661
- end
662
-
663
- context 'when the attribute cannot be changed from a non-nil value to another non-nil value' do
664
- context 'and the record remains valid' do
665
- it 'accepts (and does not raise an AttributeChangedValueError)' do
666
- model = define_active_model_class 'Example', accessors: [:name] do
667
- def name=(_value)
668
- super('constant name')
669
- end
670
- end
671
-
672
- record = model.new(name: 'some name')
673
-
674
- expect(record).to allow_value('another name').for(:name)
675
- end
676
- end
677
-
678
- context 'and the record becomes invalid' do
679
- it 'rejects with an appropriate failure message' do
680
- model = define_active_model_class 'Example', accessors: [:name] do
681
- validates_format_of :name, with: /another name/
682
-
683
- def name=(value)
684
- super('constant name')
685
- end
686
- end
687
-
688
- record = model.new(name: 'some name')
689
-
690
- assertion = lambda do
691
- expect(record).to allow_value('another name').for(:name)
692
- end
693
-
694
- message = <<-MESSAGE.strip
695
- After setting :name to ‹"another name"› -- which was read back as
696
- ‹"constant name"› -- the matcher expected the Example to be valid, but
697
- it was invalid instead, producing these validation errors:
698
-
699
- * name: ["is invalid"]
700
-
701
- As indicated in the message above, :name seems to be changing certain
702
- values as they are set, and this could have something to do with why
703
- this test is failing. If you've overridden the writer method for this
704
- attribute, then you may need to change it to make this test pass, or do
705
- something else entirely.
706
- MESSAGE
707
-
708
- expect(&assertion).to fail_with_message(message)
709
- end
710
- end
711
- end
712
- end
713
-
714
- context 'when the attribute does not exist on the model' do
715
- context 'when the assertion is positive' do
716
- it 'raises an AttributeDoesNotExistError' do
717
- model = define_class('Example')
718
-
719
- assertion = lambda do
720
- expect(model.new).to allow_value('foo').for(:nonexistent)
721
- end
722
-
723
- message = <<-MESSAGE.rstrip
724
- The matcher attempted to set :nonexistent on the Example to "foo", but
725
- that attribute does not exist.
726
- MESSAGE
727
-
728
- expect(&assertion).to raise_error(
729
- described_class::AttributeDoesNotExistError,
730
- message
731
- )
732
- end
733
- end
734
-
735
- context 'when the assertion is negative' do
736
- it 'raises an AttributeDoesNotExistError' do
737
- model = define_class('Example')
738
-
739
- assertion = lambda do
740
- expect(model.new).not_to allow_value('foo').for(:nonexistent)
741
- end
742
-
743
- message = <<-MESSAGE.rstrip
744
- The matcher attempted to set :nonexistent on the Example to "foo", but
745
- that attribute does not exist.
746
- MESSAGE
747
-
748
- expect(&assertion).to raise_error(
749
- described_class::AttributeDoesNotExistError,
750
- message
751
- )
752
- end
753
- end
754
- end
755
-
756
- context 'given attributes to preset on the record before validation' do
757
- context 'when the assertion is positive' do
758
- context 'if any attributes do not exist on the model' do
759
- it 'raises an AttributeDoesNotExistError' do
760
- model = define_active_model_class('Example', accessors: [:existent])
761
-
762
- allow_value_matcher = allow_value('foo').for(:existent).tap do |matcher|
763
- matcher.values_to_preset = { nonexistent: 'some value' }
764
- end
765
-
766
- assertion = lambda do
767
- expect(model.new).to(allow_value_matcher)
768
- end
769
-
770
- message = <<-MESSAGE.rstrip
771
- The matcher attempted to set :nonexistent on the Example to "some
772
- value", but that attribute does not exist.
773
- MESSAGE
774
-
775
- expect(&assertion).to raise_error(
776
- described_class::AttributeDoesNotExistError,
777
- message
778
- )
779
- end
780
- end
781
- end
782
-
783
- context 'when the assertion is negative' do
784
- context 'if any attributes do not exist on the model' do
785
- it 'raises an AttributeDoesNotExistError' do
786
- model = define_active_model_class('Example', accessors: [:existent])
787
-
788
- allow_value_matcher = allow_value('foo').for(:existent).tap do |matcher|
789
- matcher.values_to_preset = { nonexistent: 'some value' }
790
- end
791
-
792
- assertion = lambda do
793
- expect(model.new).not_to(allow_value_matcher)
794
- end
795
-
796
- message = <<-MESSAGE.rstrip
797
- The matcher attempted to set :nonexistent on the Example to "some
798
- value", but that attribute does not exist.
799
- MESSAGE
800
-
801
- expect(&assertion).to raise_error(
802
- described_class::AttributeDoesNotExistError,
803
- message
804
- )
805
- end
806
- end
807
- end
808
- end
809
-
810
- if active_record_supports_enum?
811
- context 'given an ActiveRecord model' do
812
- context 'where the attribute under test is an enum and the given value is a value in that enum' do
813
- it 'accepts' do
814
- model = define_model('Shipment', status: :integer) do
815
- enum status: { pending: 1, shipped: 2, delivered: 3 }
816
- end
817
-
818
- expect(model.new).to allow_value(1).for(:status)
819
- end
820
- end
821
- end
822
- end
823
- end