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,86 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::DisallowValueMatcher, type: :model do
4
- context 'an attribute with a format validation' do
5
- it 'does not match if the value is allowed' do
6
- expect(validating_format(with: /abc/)).not_to matcher('abcde').for(:attr)
7
- end
8
-
9
- it 'matches if the value is not allowed' do
10
- expect(validating_format(with: /abc/)).to matcher('xyz').for(:attr)
11
- end
12
- end
13
-
14
- context "an attribute with a context-dependent validation" do
15
- context "without the validation context" do
16
- it "does not match" do
17
- expect(validating_format(with: /abc/, on: :customisable)).not_to matcher("xyz").for(:attr)
18
- end
19
- end
20
-
21
- context "with the validation context" do
22
- it "disallows a bad value" do
23
- expect(validating_format(with: /abc/, on: :customisable)).to matcher("xyz").for(:attr).on(:customisable)
24
- end
25
-
26
- it "does not match a good value" do
27
- expect(validating_format(with: /abc/, on: :customisable)).not_to matcher("abcde").for(:attr).on(:customisable)
28
- end
29
- end
30
- end
31
-
32
- context 'an attribute with a format validation and a custom message' do
33
- it 'does not match if the value and message are both correct' do
34
- expect(validating_format(with: /abc/, message: 'good message')).
35
- not_to matcher('abcde').for(:attr).with_message('good message')
36
- end
37
-
38
- it "delegates its failure message to its allow matcher's negative failure message" do
39
- allow_matcher = double('allow_matcher',
40
- failure_message_when_negated: 'allow matcher failure',
41
- ).as_null_object
42
- allow(Shoulda::Matchers::ActiveModel::AllowValueMatcher).
43
- to receive(:new).
44
- and_return(allow_matcher)
45
-
46
- matcher = matcher('abcde').for(:attr).with_message('good message')
47
- matcher.matches?(validating_format(with: /abc/, message: 'good message'))
48
-
49
- expect(matcher.failure_message).to eq 'allow matcher failure'
50
- end
51
-
52
- it 'matches if the message is correct but the value is not' do
53
- expect(validating_format(with: /abc/, message: 'good message')).
54
- to matcher('xyz').for(:attr).with_message('good message')
55
- end
56
- end
57
-
58
- context 'an attribute where the message occurs on another attribute' do
59
- it 'matches if the message is correct but the value is not' do
60
- expect(record_with_custom_validation).to \
61
- matcher('bad value').for(:attr).with_message(/some message/, against: :attr2)
62
- end
63
-
64
- it 'does not match if the value and message are both correct' do
65
- expect(record_with_custom_validation).not_to \
66
- matcher('good value').for(:attr).with_message(/some message/, against: :attr2)
67
- end
68
-
69
- def record_with_custom_validation
70
- define_model :example, attr: :string, attr2: :string do
71
- validate :custom_validation
72
-
73
- def custom_validation
74
- if self[:attr] != 'good value'
75
- self.errors[:attr2] << 'some message'
76
- end
77
- end
78
- end.new
79
- end
80
- end
81
-
82
- def matcher(value)
83
- described_class.new(value)
84
- end
85
- alias_method :disallow_value, :matcher
86
- end
@@ -1,20 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::HaveSecurePasswordMatcher, type: :model do
4
- if active_model_3_1?
5
- it 'matches when the subject configures has_secure_password with default options' do
6
- working_model = define_model(:example, password_digest: :string) { has_secure_password }
7
- expect(working_model.new).to have_secure_password
8
- end
9
-
10
- it 'does not match when the subject does not authenticate a password' do
11
- no_secure_password = define_model(:example)
12
- expect(no_secure_password.new).not_to have_secure_password
13
- end
14
-
15
- it 'does not match when the subject is missing the password_digest attribute' do
16
- no_digest_column = define_model(:example) { has_secure_password }
17
- expect(no_digest_column.new).not_to have_secure_password
18
- end
19
- end
20
- end
@@ -1,162 +0,0 @@
1
- # encoding: UTF-8
2
- require 'unit_spec_helper'
3
-
4
- describe Shoulda::Matchers::ActiveModel::Helpers do
5
- include Shoulda::Matchers::ActiveModel
6
- after { I18n.backend.reload! }
7
-
8
- describe 'default_error_message' do
9
- context 'if the translation for the model attribute’s error exists' do
10
- it 'provides the right error message for validate_presence_of' do
11
- store_translations
12
-
13
- assert_presence_validation_has_correct_message
14
- end
15
-
16
- it 'provides the right error message for validates_length_of' do
17
- store_translations
18
-
19
- assert_length_validation_has_correct_message
20
- end
21
- end
22
-
23
- context 'if no translation for the model attribute’s error exists' do
24
- context 'and the translation for the model’s error exists' do
25
- it 'provides the right error message for validate_presence_of' do
26
- store_translations(without: :model_attribute)
27
-
28
- assert_presence_validation_has_correct_message
29
- end
30
-
31
- it 'provides the right error message for validates_length_of' do
32
- store_translations(without: :model_attribute)
33
-
34
- assert_length_validation_has_correct_message
35
- end
36
- end
37
-
38
- context 'and no translation for the model’s error exists' do
39
- context 'and the translation for the message exists' do
40
- it 'provides the right error message for validate_presence_of' do
41
- store_translations(without: [:model_attribute, :model])
42
-
43
- assert_presence_validation_has_correct_message
44
- end
45
-
46
- it 'provides the right error message for validates_length_of' do
47
- store_translations(without: [:model_attribute, :model])
48
-
49
- assert_length_validation_has_correct_message
50
- end
51
- end
52
-
53
- context 'and no translation for the message exists' do
54
- context 'and the translation for the attribute exists' do
55
- it 'provides the right error message for validate_presence_of' do
56
- store_translations(without: [:model_attribute, :model, :message])
57
-
58
- assert_presence_validation_has_correct_message
59
- end
60
-
61
- it 'provides the right error message for validates_length_of' do
62
- store_translations(without: [:model_attribute, :model, :message])
63
-
64
- assert_length_validation_has_correct_message
65
- end
66
- end
67
-
68
- context 'and no translation for the attribute exists' do
69
- it 'provides the general error message for validate_presence_of' do
70
- assert_presence_validation_has_correct_message
71
- end
72
-
73
- it 'provides the general error message for validates_length_of' do
74
- assert_length_validation_has_correct_message
75
- end
76
- end
77
- end
78
- end
79
- end
80
-
81
- context 'if ActiveModel::Errors#generate_message behavior has changed' do
82
- it 'provides the right error message for validate_presence_of' do
83
- stub_active_model_message_generation(type: :blank,
84
- message: 'Behavior has diverged.')
85
- assert_presence_validation_has_correct_message
86
- end
87
- end
88
- end
89
-
90
- def assert_presence_validation_has_correct_message
91
- record = define_model :example, attr: :string do
92
- validates_presence_of :attr
93
- end.new
94
- expect(record).to validate_presence_of(:attr)
95
- end
96
-
97
- def assert_length_validation_has_correct_message
98
- record = define_model :example, attr: :string do
99
- validates_length_of :attr, is: 40, allow_blank: true
100
- end.new
101
- expect(record).to validate_length_of(:attr).is_equal_to(40)
102
- end
103
-
104
- def store_translations(options = {without: []})
105
- options[:without] = Array.wrap(options[:without] || [])
106
-
107
- translations = {
108
- activerecord: {
109
- errors: {
110
- models: {
111
- example: {
112
- attributes: {
113
- attr: {}
114
- }
115
- }
116
- },
117
- messages: {}
118
- }
119
- },
120
- errors: {
121
- attributes: {
122
- attr: {}
123
- },
124
- messages: {}
125
- }
126
- }
127
-
128
- unless options[:without].include?(:model_attribute)
129
- translations[:activerecord][:errors][:models][:example][:attributes][:attr][:blank] = "Don't you do that to me!"
130
- translations[:activerecord][:errors][:models][:example][:attributes][:attr][:wrong_length] = "Don't you do that to me!"
131
- end
132
-
133
- unless options[:without].include?(:model)
134
- translations[:activerecord][:errors][:models][:example][:blank] = 'Give it one more try!'
135
- translations[:activerecord][:errors][:models][:example][:wrong_length] = 'Give it one more try!'
136
- end
137
-
138
- unless options[:without].include?(:message)
139
- translations[:activerecord][:errors][:messages][:blank] = 'Oh no!'
140
- translations[:activerecord][:errors][:messages][:wrong_length] = 'Oh no!'
141
- end
142
-
143
- unless options[:without].include?(:attribute)
144
- translations[:errors][:attributes][:attr][:blank] = 'Seriously?'
145
- translations[:errors][:attributes][:attr][:wrong_length] = 'Seriously?'
146
- end
147
-
148
- I18n.backend.store_translations(:en, translations)
149
- end
150
-
151
- def stub_active_model_message_generation(options = {})
152
- attribute = options.delete(:attribute) || :attr
153
- message = options.delete(:message)
154
- type = options.delete(:type)
155
-
156
- expect_any_instance_of(ActiveModel::Errors).
157
- to receive(:generate_message).
158
- with(attribute, type, {}).
159
- at_least(1).
160
- and_return(message)
161
- end
162
- end
@@ -1,266 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::ValidateAbsenceOfMatcher, type: :model do
4
- if active_model_4_0?
5
- def self.available_column_types
6
- [
7
- :string,
8
- :text,
9
- :integer,
10
- :float,
11
- :decimal,
12
- :datetime,
13
- :timestamp,
14
- :time,
15
- :date,
16
- :binary
17
- ]
18
- end
19
-
20
- context 'a model with an absence validation' do
21
- it 'accepts' do
22
- expect(validating_absence_of(:attr)).to validate_absence_of(:attr)
23
- end
24
-
25
- it 'does not override the default message with a present' do
26
- expect(validating_absence_of(:attr)).to validate_absence_of(:attr).with_message(nil)
27
- end
28
-
29
- available_column_types.each do |type|
30
- context "when column is of type #{type}" do
31
- it "accepts" do
32
- expect(validating_absence_of(:attr, {}, type: type)).
33
- to validate_absence_of(:attr)
34
- end
35
-
36
- it_supports(
37
- 'ignoring_interference_by_writer',
38
- tests: {
39
- accept_if_qualified_but_changing_value_does_not_interfere: {
40
- changing_values_with: :next_value
41
- },
42
- }
43
- )
44
-
45
- define_method(:validation_matcher_scenario_args) do |*args|
46
- super(*args).deep_merge(column_type: type)
47
- end
48
- end
49
- end
50
-
51
- def validation_matcher_scenario_args
52
- super.deep_merge(model_creator: :active_record)
53
- end
54
- end
55
-
56
- context 'a model without an absence validation' do
57
- it 'rejects with the correct failure message' do
58
- record = define_model(:example, attr: :string).new
59
-
60
- message = <<-MESSAGE
61
- Example did not properly validate that :attr is empty/falsy.
62
- After setting :attr to ‹"an arbitrary value"›, the matcher expected
63
- the Example to be invalid, but it was valid instead.
64
- MESSAGE
65
-
66
- assertion = lambda do
67
- expect(record).to validate_absence_of(:attr)
68
- end
69
-
70
- expect(&assertion).to fail_with_message(message)
71
- end
72
- end
73
-
74
- context 'an ActiveModel class with an absence validation' do
75
- it 'accepts' do
76
- expect(active_model_validating_absence_of(:attr)).to validate_absence_of(:attr)
77
- end
78
-
79
- it 'does not override the default message with a blank' do
80
- expect(active_model_validating_absence_of(:attr)).to validate_absence_of(:attr).with_message(nil)
81
- end
82
-
83
- it_supports(
84
- 'ignoring_interference_by_writer',
85
- tests: {
86
- accept_if_qualified_but_changing_value_does_not_interfere: {
87
- changing_values_with: :upcase
88
- },
89
- }
90
- )
91
-
92
- def validation_matcher_scenario_args
93
- super.deep_merge(model_creator: :active_model)
94
- end
95
- end
96
-
97
- context 'an ActiveModel class without an absence validation' do
98
- it 'rejects with the correct failure message' do
99
- message = <<-MESSAGE
100
- Example did not properly validate that :attr is empty/falsy.
101
- After setting :attr to ‹"an arbitrary value"›, the matcher expected
102
- the Example to be invalid, but it was valid instead.
103
- MESSAGE
104
-
105
- assertion = lambda do
106
- expect(active_model_with(:attr)).to validate_absence_of(:attr)
107
- end
108
-
109
- expect(&assertion).to fail_with_message(message)
110
- end
111
- end
112
-
113
- context 'a has_many association with an absence validation' do
114
- it 'requires the attribute to not be set' do
115
- expect(having_many(:children, absence: true)).to validate_absence_of(:children)
116
- end
117
-
118
- it_supports(
119
- 'ignoring_interference_by_writer',
120
- tests: {
121
- accept_if_qualified_but_changing_value_does_not_interfere: {
122
- changing_values_with: :next_value
123
- },
124
- }
125
- )
126
-
127
- def validation_matcher_scenario_args
128
- super.deep_merge(model_creator: :"active_record/has_many")
129
- end
130
- end
131
-
132
- context 'a has_many association without an absence validation' do
133
- it 'does not require the attribute to not be set' do
134
- expect(having_many(:children, absence: false)).
135
- not_to validate_absence_of(:children)
136
- end
137
- end
138
-
139
- context 'an absent has_and_belongs_to_many association' do
140
- it 'accepts' do
141
- model = having_and_belonging_to_many(:children, absence: true)
142
- expect(model).to validate_absence_of(:children)
143
- end
144
-
145
- it_supports(
146
- 'ignoring_interference_by_writer',
147
- tests: {
148
- accept_if_qualified_but_changing_value_does_not_interfere: {
149
- changing_values_with: :next_value
150
- },
151
- }
152
- )
153
-
154
- def validation_matcher_scenario_args
155
- super.deep_merge(model_creator: :"active_record/habtm")
156
- end
157
- end
158
-
159
- context 'a non-absent has_and_belongs_to_many association' do
160
- it 'rejects with the correct failure message' do
161
- model = having_and_belonging_to_many(:children, absence: false)
162
-
163
- message = <<-MESSAGE
164
- Parent did not properly validate that :children is empty/falsy.
165
- After setting :children to ‹[#<Child id: nil>]›, the matcher expected
166
- the Parent to be invalid, but it was valid instead.
167
- MESSAGE
168
-
169
- assertion = lambda do
170
- expect(model).to validate_absence_of(:children)
171
- end
172
-
173
- expect(&assertion).to fail_with_message(message)
174
- end
175
- end
176
-
177
- context "an i18n translation containing %{attribute} and %{model}" do
178
- after { I18n.backend.reload! }
179
-
180
- it "does not raise an exception" do
181
- stub_translation("activerecord.errors.messages.present",
182
- "%{attribute} must be blank in a %{model}")
183
-
184
- expect {
185
- expect(validating_absence_of(:attr)).to validate_absence_of(:attr)
186
- }.to_not raise_exception
187
- end
188
- end
189
-
190
- context "an attribute with a context-dependent validation" do
191
- context "without the validation context" do
192
- it "does not match" do
193
- expect(validating_absence_of(:attr, on: :customisable)).not_to validate_absence_of(:attr)
194
- end
195
- end
196
-
197
- context "with the validation context" do
198
- it "matches" do
199
- expect(validating_absence_of(:attr, on: :customisable)).to validate_absence_of(:attr).on(:customisable)
200
- end
201
- end
202
- end
203
-
204
- def define_model_validating_absence_of(attr, validation_options = {}, given_column_options = {})
205
- default_column_options = { type: :string, options: {} }
206
- column_options = default_column_options.merge(given_column_options)
207
-
208
- define_model :example, attr => column_options do |model|
209
- model.validates_absence_of(attr, validation_options)
210
-
211
- if block_given?
212
- yield model
213
- end
214
- end
215
- end
216
-
217
- def validating_absence_of(attr, validation_options = {}, given_column_options = {})
218
- model = define_model_validating_absence_of(
219
- attr,
220
- validation_options,
221
- given_column_options
222
- )
223
- model.new
224
- end
225
- alias_method :build_record_validating_absence_of, :validating_absence_of
226
-
227
- def active_model_with(attr, &block)
228
- define_active_model_class('Example', accessors: [attr], &block).new
229
- end
230
-
231
- def active_model_validating_absence_of(attr)
232
- active_model_with(attr) do
233
- validates_absence_of attr
234
- end
235
- end
236
-
237
- def having_many(plural_name, options = {})
238
- define_model plural_name.to_s.singularize
239
- define_model :parent do
240
- has_many plural_name
241
- if options[:absence]
242
- validates_absence_of plural_name
243
- end
244
- end.new
245
- end
246
-
247
- def having_and_belonging_to_many(plural_name, options = {})
248
- create_table 'children_parents', id: false do |t|
249
- t.integer "#{plural_name.to_s.singularize}_id"
250
- t.integer :parent_id
251
- end
252
-
253
- define_model plural_name.to_s.singularize
254
- define_model :parent do
255
- has_and_belongs_to_many plural_name
256
- if options[:absence]
257
- validates_absence_of plural_name
258
- end
259
- end.new
260
- end
261
-
262
- def validation_matcher_scenario_args
263
- super.deep_merge(matcher_name: :validate_absence_of)
264
- end
265
- end
266
- end
@@ -1,91 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::ValidateAcceptanceOfMatcher, type: :model do
4
- context 'a model with an acceptance validation' do
5
- it 'accepts when the attributes match' do
6
- expect(record_validating_acceptance).to matcher
7
- end
8
-
9
- it 'does not overwrite the default message with nil' do
10
- expect(record_validating_acceptance).to matcher.with_message(nil)
11
- end
12
-
13
- it_supports(
14
- 'ignoring_interference_by_writer',
15
- tests: {
16
- accept_if_qualified_but_changing_value_does_not_interfere: {
17
- changing_values_with: :never_falsy,
18
- },
19
- reject_if_qualified_but_changing_value_interferes: {
20
- model_name: 'Example',
21
- attribute_name: :attr,
22
- changing_values_with: :always_nil,
23
- expected_message: <<-MESSAGE.strip
24
- Example did not properly validate that :attr has been set to "1".
25
- After setting :attr to ‹false› -- which was read back as ‹nil› -- the
26
- matcher expected the Example to be invalid, but it was valid instead.
27
-
28
- As indicated in the message above, :attr seems to be changing certain
29
- values as they are set, and this could have something to do with why
30
- this test is failing. If you've overridden the writer method for this
31
- attribute, then you may need to change it to make this test pass, or
32
- do something else entirely.
33
- MESSAGE
34
- },
35
- },
36
- model_creator: :active_model
37
- )
38
- end
39
-
40
- context 'a model without an acceptance validation' do
41
- it 'rejects' do
42
- expect(record_validating_nothing).not_to matcher
43
- end
44
- end
45
-
46
- context 'an attribute which must be accepted with a custom message' do
47
- it 'accepts when the message matches' do
48
- expect(record_validating_acceptance(message: 'custom')).
49
- to matcher.with_message(/custom/)
50
- end
51
-
52
- it 'rejects when the message does not match' do
53
- expect(record_validating_acceptance(message: 'custom')).
54
- not_to matcher.with_message(/wrong/)
55
- end
56
- end
57
-
58
- def matcher
59
- validate_acceptance_of(:attr)
60
- end
61
-
62
- def model_validating_nothing(options = {}, &block)
63
- attribute_name = options.fetch(:attribute_name, :attr)
64
- define_active_model_class(:example, accessors: [attribute_name], &block)
65
- end
66
-
67
- def record_validating_nothing
68
- model_validating_nothing.new
69
- end
70
-
71
- def model_validating_acceptance(options = {})
72
- attribute_name = options.fetch(:attribute_name, :attr)
73
-
74
- model_validating_nothing(attribute_name: attribute_name) do
75
- validates_acceptance_of attribute_name, options
76
- end
77
- end
78
-
79
- alias_method :define_model_validating_acceptance, :model_validating_acceptance
80
-
81
- def record_validating_acceptance(options = {})
82
- model_validating_acceptance(options).new
83
- end
84
-
85
- alias_method :build_record_validating_acceptance,
86
- :record_validating_acceptance
87
-
88
- def validation_matcher_scenario_args
89
- { matcher_name: :validate_acceptance_of }
90
- end
91
- end