shoulda-matchers 3.1.0 → 5.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 (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,149 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::ValidateConfirmationOfMatcher, type: :model do
4
- include UnitTests::ConfirmationMatcherHelpers
5
-
6
- context '#description' do
7
- it 'states that the confirmation must match its base attribute' do
8
- builder = builder_for_record_validating_confirmation
9
- message = "validate that :#{builder.confirmation_attribute} matches :#{builder.attribute_to_confirm}"
10
- matcher = described_class.new(builder.attribute_to_confirm)
11
- expect(matcher.description).to eq(message)
12
- end
13
- end
14
-
15
- context 'when the model has a confirmation validation' do
16
- it 'passes' do
17
- builder = builder_for_record_validating_confirmation
18
- expect(builder.record).
19
- to validate_confirmation_of(builder.attribute_to_confirm)
20
- end
21
-
22
- context 'when a nil message is specified' do
23
- it 'ignores it' do
24
- builder = builder_for_record_validating_confirmation
25
- expect(builder.record).
26
- to validate_confirmation_of(builder.attribute_to_confirm).
27
- with_message(nil)
28
- end
29
- end
30
-
31
- it_supports(
32
- 'ignoring_interference_by_writer',
33
- tests: {
34
- reject_if_qualified_but_changing_value_interferes: {
35
- model_name: 'Example',
36
- attribute_name: :password,
37
- changing_values_with: :next_value,
38
- expected_message: <<-MESSAGE.strip
39
- Example did not properly validate that :password_confirmation matches
40
- :password.
41
- After setting :password_confirmation to ‹"same value"›, then setting
42
- :password to ‹"same value"› -- which was read back as ‹"same valuf"›
43
- -- the matcher expected the Example to be valid, but it was invalid
44
- instead, producing these validation errors:
45
-
46
- * password_confirmation: ["doesn't match Password"]
47
-
48
- As indicated in the message above, :password seems to be changing
49
- certain values as they are set, and this could have something to do
50
- with why this test is failing. If you've overridden the writer method
51
- for this attribute, then you may need to change it to make this test
52
- pass, or do something else entirely.
53
- MESSAGE
54
- },
55
- },
56
- model_creator: :active_model
57
- )
58
- end
59
-
60
- context 'when the model does not have a confirmation attribute' do
61
- it 'raises an AttributeDoesNotExistError' do
62
- model = define_model(:example)
63
-
64
- assertion = lambda do
65
- expect(model.new).to validate_confirmation_of(:attribute_to_confirm)
66
- end
67
-
68
- message = <<-MESSAGE.rstrip
69
- The matcher attempted to set :attribute_to_confirm_confirmation on the
70
- Example to "some value", but that attribute does not exist.
71
- MESSAGE
72
-
73
- expect(&assertion).to raise_error(
74
- Shoulda::Matchers::ActiveModel::AllowValueMatcher::AttributeDoesNotExistError,
75
- message
76
- )
77
- end
78
- end
79
-
80
- context 'when the model does not have the attribute under test' do
81
- it 'raises an AttributeDoesNotExistError' do
82
- model = define_model(:example, attribute_to_confirm_confirmation: :string)
83
-
84
- assertion = lambda do
85
- expect(model.new).to validate_confirmation_of(:attribute_to_confirm)
86
- end
87
-
88
- message = <<-MESSAGE.rstrip
89
- The matcher attempted to set :attribute_to_confirm on the Example to
90
- "different value", but that attribute does not exist.
91
- MESSAGE
92
-
93
- expect(&assertion).to raise_error(
94
- Shoulda::Matchers::ActiveModel::AllowValueMatcher::AttributeDoesNotExistError,
95
- message
96
- )
97
- end
98
- end
99
-
100
- context 'when the model has all attributes, but does not have the validation' do
101
- it 'fails with an appropriate failure message' do
102
- model = define_model(:example, attribute_to_confirm: :string) do
103
- attr_accessor :attribute_to_confirm_confirmation
104
- end
105
-
106
- assertion = lambda do
107
- expect(model.new).to validate_confirmation_of(:attribute_to_confirm)
108
- end
109
-
110
- message = <<-MESSAGE
111
- Example did not properly validate that
112
- :attribute_to_confirm_confirmation matches :attribute_to_confirm.
113
- After setting :attribute_to_confirm_confirmation to ‹"some value"›,
114
- then setting :attribute_to_confirm to ‹"different value"›, the matcher
115
- expected the Example to be invalid, but it was valid instead.
116
- MESSAGE
117
-
118
- expect(&assertion).to fail_with_message(message)
119
- end
120
- end
121
-
122
- context 'when both validation and matcher specify a custom message' do
123
- it 'passes when the expected and actual messages match' do
124
- builder = builder_for_record_validating_confirmation(message: 'custom')
125
- expect(builder.record).
126
- to validate_confirmation_of(builder.attribute_to_confirm).
127
- with_message(/custom/)
128
- end
129
-
130
- it 'fails when the expected and actual messages do not match' do
131
- builder = builder_for_record_validating_confirmation(message: 'custom')
132
- expect(builder.record).
133
- not_to validate_confirmation_of(builder.attribute_to_confirm).
134
- with_message(/wrong/)
135
- end
136
- end
137
-
138
- context 'when the validation specifies a message via i18n' do
139
- it 'passes' do
140
- builder = builder_for_record_validating_confirmation_with_18n_message
141
- expect(builder.record).
142
- to validate_confirmation_of(builder.attribute_to_confirm)
143
- end
144
- end
145
-
146
- def validation_matcher_scenario_args
147
- super.deep_merge(matcher_name: :validate_confirmation_of)
148
- end
149
- end
@@ -1,207 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::ValidateExclusionOfMatcher, type: :model do
4
- context 'an attribute which must be excluded from a range' do
5
- it 'accepts ensuring the correct range' do
6
- expect(validating_exclusion(in: 2..5)).
7
- to validate_exclusion_of(:attr).in_range(2..5)
8
- end
9
-
10
- it 'rejects ensuring excluded value' do
11
- expect(validating_exclusion(in: 2..5)).
12
- not_to validate_exclusion_of(:attr).in_range(2..6)
13
- end
14
-
15
- it 'does not override the default message with a blank' do
16
- expect(validating_exclusion(in: 2..5)).
17
- to validate_exclusion_of(:attr).in_range(2..5).with_message(nil)
18
- end
19
-
20
- it_supports(
21
- 'ignoring_interference_by_writer',
22
- tests: {
23
- reject_if_qualified_but_changing_value_interferes: {
24
- model_name: 'Example',
25
- attribute_name: :attr,
26
- changing_values_with: :next_value,
27
- expected_message: <<-MESSAGE.strip
28
- Example did not properly validate that :attr lies outside the range ‹2›
29
- to ‹5›.
30
- After setting :attr to ‹1› -- which was read back as ‹2› -- the
31
- matcher expected the Example to be valid, but it was invalid instead,
32
- producing these validation errors:
33
-
34
- * attr: ["is reserved"]
35
-
36
- As indicated in the message above, :attr seems to be changing certain
37
- values as they are set, and this could have something to do with why
38
- this test is failing. If you've overridden the writer method for this
39
- attribute, then you may need to change it to make this test pass, or
40
- do something else entirely.
41
- MESSAGE
42
- },
43
- },
44
- model_creator: :active_model
45
- ) do
46
- def validation_matcher_scenario_args
47
- super.deep_merge(validation_options: { in: 2..5 })
48
- end
49
-
50
- def configure_validation_matcher(matcher)
51
- matcher.in_range(2..5)
52
- end
53
- end
54
- end
55
-
56
- context 'an attribute which must be excluded from a range with excluded end' do
57
- it 'accepts ensuring the correct range' do
58
- expect(validating_exclusion(in: 2...5)).
59
- to validate_exclusion_of(:attr).in_range(2...5)
60
- end
61
-
62
- it 'rejects ensuring excluded value' do
63
- expect(validating_exclusion(in: 2...5)).
64
- not_to validate_exclusion_of(:attr).in_range(2...4)
65
- end
66
- end
67
-
68
- context 'an attribute with a custom validation message' do
69
- it 'accepts ensuring the correct range' do
70
- expect(validating_exclusion(in: 2..4, message: 'not good')).
71
- to validate_exclusion_of(:attr).in_range(2..4).with_message(/not good/)
72
- end
73
- end
74
-
75
- context 'an attribute with custom range validations' do
76
- it 'accepts ensuring the correct range and messages' do
77
- model = custom_validation do
78
- if attr >= 2 && attr <= 5
79
- errors.add(:attr, 'should be out of this range')
80
- end
81
- end
82
-
83
- expect(model).to validate_exclusion_of(:attr).in_range(2..5).
84
- with_message(/should be out of this range/)
85
-
86
- model = custom_validation do
87
- if attr >= 2 && attr <= 4
88
- errors.add(:attr, 'should be out of this range')
89
- end
90
- end
91
-
92
- expect(model).to validate_exclusion_of(:attr).in_range(2...5).
93
- with_message(/should be out of this range/)
94
- end
95
-
96
- it 'has correct description' do
97
- matcher = validate_exclusion_of(:attr).in_range(1..10)
98
-
99
- expect(matcher.description).to eq(
100
- 'validate that :attr lies outside the range ‹1› to ‹10›'
101
- )
102
- end
103
- end
104
-
105
- context 'an attribute which must be excluded from an array' do
106
- it 'accepts with correct array' do
107
- expect(validating_exclusion(in: %w(one two))).
108
- to validate_exclusion_of(:attr).in_array(%w(one two))
109
- end
110
-
111
- it 'rejects when only part of array matches' do
112
- expect(validating_exclusion(in: %w(one two))).
113
- not_to validate_exclusion_of(:attr).in_array(%w(one wrong_value))
114
- end
115
-
116
- it 'rejects when array does not match at all' do
117
- expect(validating_exclusion(in: %w(one two))).
118
- not_to validate_exclusion_of(:attr).in_array(%w(cat dog))
119
- end
120
-
121
- context 'when there is one value' do
122
- it 'has correct description' do
123
- expect(validate_exclusion_of(:attr).in_array([true]).description).
124
- to eq 'validate that :attr is not ‹true›'
125
- end
126
- end
127
-
128
- context 'when there are two values' do
129
- it 'has correct description' do
130
- matcher = validate_exclusion_of(:attr).in_array([true, 'dog'])
131
-
132
- expect(matcher.description).to eq(
133
- 'validate that :attr is neither ‹true› nor ‹"dog"›'
134
- )
135
- end
136
- end
137
-
138
- context 'when there are three or more values' do
139
- it 'has correct description' do
140
- matcher = validate_exclusion_of(:attr).in_array([true, 'dog', 'cat'])
141
-
142
- expect(matcher.description).to eq(
143
- 'validate that :attr is neither ‹true›, ‹"dog"›, nor ‹"cat"›'
144
- )
145
- end
146
- end
147
-
148
- it_supports(
149
- 'ignoring_interference_by_writer',
150
- tests: {
151
- reject_if_qualified_but_changing_value_interferes: {
152
- model_name: 'Example',
153
- attribute_name: :attr,
154
- changing_values_with: :next_value,
155
- expected_message: <<-MESSAGE.strip
156
- Example did not properly validate that :attr is neither ‹"one"› nor
157
- ‹"two"›.
158
- After setting :attr to ‹"one"› -- which was read back as ‹"onf"› --
159
- the matcher expected the Example to be invalid, but it was valid
160
- instead.
161
-
162
- As indicated in the message above, :attr seems to be changing certain
163
- values as they are set, and this could have something to do with why
164
- this test is failing. If you've overridden the writer method for this
165
- attribute, then you may need to change it to make this test pass, or
166
- do something else entirely.
167
- MESSAGE
168
- },
169
- },
170
- model_creator: :active_model
171
- ) do
172
- def validation_matcher_scenario_args
173
- super.deep_merge(validation_options: { in: ['one', 'two'] })
174
- end
175
-
176
- def configure_validation_matcher(matcher)
177
- matcher.in_array(['one', 'two'])
178
- end
179
- end
180
-
181
- def define_model_validating_exclusion(options)
182
- options = options.dup
183
- column_type = options.delete(:column_type) { :string }
184
- super options.merge(column_type: column_type)
185
- end
186
- end
187
-
188
- def define_model_validating_exclusion(options)
189
- options = options.dup
190
- attribute_name = options.delete(:attribute_name) { :attr }
191
- column_type = options.delete(:column_type) { :integer }
192
-
193
- define_model(:example, attribute_name => column_type) do |model|
194
- model.validates_exclusion_of(attribute_name, options)
195
- end
196
- end
197
-
198
- def validating_exclusion(options)
199
- define_model_validating_exclusion(options).new
200
- end
201
-
202
- alias_method :build_record_validating_exclusion, :validating_exclusion
203
-
204
- def validation_matcher_scenario_args
205
- super.deep_merge(matcher_name: :validate_exclusion_of)
206
- end
207
- end