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,380 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::ValidatePresenceOfMatcher, type: :model do
4
- context 'a model with a presence validation' do
5
- it 'accepts' do
6
- expect(validating_presence).to matcher
7
- end
8
-
9
- it 'does not override the default message with a blank' do
10
- expect(validating_presence).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: :nil_to_blank
18
- },
19
- reject_if_qualified_but_changing_value_interferes: {
20
- model_name: 'Example',
21
- attribute_name: :attr,
22
- changing_values_with: :never_falsy,
23
- expected_message: <<-MESSAGE
24
- Example did not properly validate that :attr cannot be empty/falsy.
25
- After setting :attr to ‹nil› -- which was read back as ‹"dummy value"›
26
- -- the matcher expected the Example to be invalid, but it was valid
27
- instead.
28
-
29
- As indicated in the message above, :attr seems to be changing certain
30
- values as they are set, and this could have something to do with why
31
- this test is failing. If you've overridden the writer method for this
32
- attribute, then you may need to change it to make this test pass, or
33
- do something else entirely.
34
- MESSAGE
35
- }
36
- }
37
- )
38
- end
39
-
40
- context 'a model without a presence validation' do
41
- it 'rejects with the correct failure message' do
42
- record = define_model(:example, attr: :string).new
43
-
44
- assertion = lambda do
45
- expect(record).to matcher
46
- end
47
-
48
- message = <<-MESSAGE
49
- Example did not properly validate that :attr cannot be empty/falsy.
50
- After setting :attr to ‹nil›, the matcher expected the Example to be
51
- invalid, but it was valid instead.
52
- MESSAGE
53
-
54
- expect(&assertion).to fail_with_message(message)
55
- end
56
- end
57
-
58
- context 'an ActiveModel class with a presence validation' do
59
- it 'accepts' do
60
- expect(active_model_validating_presence).to matcher
61
- end
62
-
63
- it 'does not override the default message with a blank' do
64
- expect(active_model_validating_presence).to matcher.with_message(nil)
65
- end
66
-
67
- it_supports(
68
- 'ignoring_interference_by_writer',
69
- tests: {
70
- accept_if_qualified_but_changing_value_does_not_interfere: {
71
- changing_values_with: :nil_to_blank
72
- },
73
- reject_if_qualified_but_changing_value_interferes: {
74
- model_name: 'Example',
75
- attribute_name: :attr,
76
- changing_values_with: :never_falsy,
77
- expected_message: <<-MESSAGE
78
- Example did not properly validate that :attr cannot be empty/falsy.
79
- After setting :attr to ‹nil› -- which was read back as ‹"dummy value"›
80
- -- the matcher expected the Example to be invalid, but it was valid
81
- instead.
82
-
83
- As indicated in the message above, :attr seems to be changing certain
84
- values as they are set, and this could have something to do with why
85
- this test is failing. If you've overridden the writer method for this
86
- attribute, then you may need to change it to make this test pass, or
87
- do something else entirely.
88
- MESSAGE
89
- }
90
- }
91
- )
92
-
93
- def model_creator
94
- :active_model
95
- end
96
- end
97
-
98
- context 'an ActiveModel class without a presence validation' do
99
- it 'rejects with the correct failure message' do
100
- assertion = lambda do
101
- expect(active_model).to matcher
102
- end
103
-
104
- message = <<-MESSAGE
105
- Example did not properly validate that :attr cannot be empty/falsy.
106
- After setting :attr to ‹nil›, the matcher expected the Example to be
107
- invalid, but it was valid instead.
108
- MESSAGE
109
-
110
- expect(&assertion).to fail_with_message(message)
111
- end
112
- end
113
-
114
- context 'a has_many association with a presence validation' do
115
- it 'requires the attribute to be set' do
116
- expect(has_many_children(presence: true)).to validate_presence_of(:children)
117
- end
118
-
119
- it_supports(
120
- 'ignoring_interference_by_writer',
121
- tests: {
122
- accept_if_qualified_but_changing_value_does_not_interfere: {
123
- changing_values_with: :nil_to_blank
124
- },
125
- reject_if_qualified_but_changing_value_interferes: {
126
- model_name: 'Example',
127
- attribute_name: :attr,
128
- changing_values_with: :never_falsy,
129
- expected_message: <<-MESSAGE
130
- Example did not properly validate that :attr cannot be empty/falsy.
131
- After setting :attr to ‹nil› -- which was read back as ‹"dummy value"›
132
- -- the matcher expected the Example to be invalid, but it was valid
133
- instead.
134
-
135
- As indicated in the message above, :attr seems to be changing certain
136
- values as they are set, and this could have something to do with why
137
- this test is failing. If you've overridden the writer method for this
138
- attribute, then you may need to change it to make this test pass, or
139
- do something else entirely.
140
- MESSAGE
141
- }
142
- }
143
- )
144
-
145
- def model_creator
146
- :"active_record/has_many"
147
- end
148
- end
149
-
150
- context 'a has_many association without a presence validation' do
151
- it 'does not require the attribute to be set' do
152
- expect(has_many_children(presence: false)).
153
- not_to validate_presence_of(:children)
154
- end
155
- end
156
-
157
- context 'a required has_and_belongs_to_many association' do
158
- it 'accepts' do
159
- expect(build_record_having_and_belonging_to_many).
160
- to validate_presence_of(:children)
161
- end
162
-
163
- def build_record_having_and_belonging_to_many
164
- create_table 'children_parents', id: false do |t|
165
- t.integer :child_id
166
- t.integer :parent_id
167
- end
168
-
169
- define_model :child
170
-
171
- define_model :parent do
172
- has_and_belongs_to_many :children
173
- validates_presence_of :children
174
- end.new
175
- end
176
-
177
- it_supports(
178
- 'ignoring_interference_by_writer',
179
- tests: {
180
- accept_if_qualified_but_changing_value_does_not_interfere: {
181
- changing_values_with: :nil_to_blank
182
- },
183
- reject_if_qualified_but_changing_value_interferes: {
184
- model_name: 'Example',
185
- attribute_name: :attr,
186
- changing_values_with: :never_falsy,
187
- expected_message: <<-MESSAGE
188
- Example did not properly validate that :attr cannot be empty/falsy.
189
- After setting :attr to ‹nil› -- which was read back as ‹"dummy value"›
190
- -- the matcher expected the Example to be invalid, but it was valid
191
- instead.
192
-
193
- As indicated in the message above, :attr seems to be changing certain
194
- values as they are set, and this could have something to do with why
195
- this test is failing. If you've overridden the writer method for this
196
- attribute, then you may need to change it to make this test pass, or
197
- do something else entirely.
198
- MESSAGE
199
- }
200
- }
201
- )
202
-
203
- def model_creator
204
- :"active_record/has_and_belongs_to_many"
205
- end
206
- end
207
-
208
- context 'an optional has_and_belongs_to_many association' do
209
- before do
210
- define_model :child
211
- @model = define_model :parent do
212
- has_and_belongs_to_many :children
213
- end.new
214
- create_table 'children_parents', id: false do |t|
215
- t.integer :child_id
216
- t.integer :parent_id
217
- end
218
- end
219
-
220
- it 'rejects with the correct failure message' do
221
- assertion = lambda do
222
- expect(@model).to validate_presence_of(:children)
223
- end
224
-
225
- message = <<-MESSAGE
226
- Parent did not properly validate that :children cannot be empty/falsy.
227
- After setting :children to ‹[]›, the matcher expected the Parent to be
228
- invalid, but it was valid instead.
229
- MESSAGE
230
-
231
- expect(&assertion).to fail_with_message(message)
232
- end
233
- end
234
-
235
- context "an i18n translation containing %{attribute} and %{model}" do
236
- before do
237
- stub_translation(
238
- "activerecord.errors.messages.blank",
239
- "Please enter a %{attribute} for your %{model}")
240
- end
241
-
242
- after { I18n.backend.reload! }
243
-
244
- it "does not raise an exception" do
245
- expect {
246
- expect(validating_presence).to validate_presence_of(:attr)
247
- }.to_not raise_exception
248
- end
249
- end
250
-
251
- if active_model_3_2?
252
- context 'a strictly required attribute' do
253
- it 'accepts when the :strict options match' do
254
- expect(validating_presence(strict: true)).to matcher.strict
255
- end
256
-
257
- it 'rejects with the correct failure message when the :strict options do not match' do
258
- assertion = lambda do
259
- expect(validating_presence(strict: false)).to matcher.strict
260
- end
261
-
262
- message = <<-MESSAGE
263
- Example did not properly validate that :attr cannot be empty/falsy,
264
- raising a validation exception on failure.
265
- After setting :attr to ‹nil›, the matcher expected the Example to be
266
- invalid and to raise a validation exception, but the record produced
267
- validation errors instead.
268
- MESSAGE
269
-
270
- expect(&assertion).to fail_with_message(message)
271
- end
272
- end
273
-
274
- it 'does not override the default message with a blank' do
275
- expect(validating_presence(strict: true)).
276
- to matcher.strict.with_message(nil)
277
- end
278
- end
279
-
280
- context "an attribute with a context-dependent validation" do
281
- context "without the validation context" do
282
- it "does not match" do
283
- expect(validating_presence(on: :customisable)).not_to matcher
284
- end
285
- end
286
-
287
- context "with the validation context" do
288
- it "matches" do
289
- expect(validating_presence(on: :customisable)).to matcher.on(:customisable)
290
- end
291
- end
292
- end
293
-
294
- context 'an active_resource model' do
295
- context 'with the validation context' do
296
- it 'does not raise an exception' do
297
- expect {
298
- expect(active_resource_model).to validate_presence_of(:attr)
299
- }.to_not raise_exception
300
- end
301
- end
302
- end
303
-
304
- if rails_4_x?
305
- context 'against a pre-set password in a model that has_secure_password' do
306
- it 'raises a CouldNotSetPasswordError' do
307
- user_class = define_model :user, password_digest: :string do
308
- has_secure_password validations: false
309
- validates_presence_of :password
310
- end
311
-
312
- user = user_class.new
313
- user.password = 'something'
314
-
315
- assertion = lambda do
316
- expect(user).to validate_presence_of(:password)
317
- end
318
-
319
- expect(&assertion).to raise_error(
320
- Shoulda::Matchers::ActiveModel::CouldNotSetPasswordError
321
- )
322
- end
323
- end
324
- end
325
-
326
- context 'when the attribute typecasts nil to another blank value, such as an empty array' do
327
- it 'accepts (and does not raise an AttributeChangedValueError)' do
328
- model = define_active_model_class :example, accessors: [:foo] do
329
- validates_presence_of :foo
330
-
331
- def foo=(value)
332
- super(Array.wrap(value))
333
- end
334
- end
335
-
336
- expect(model.new).to validate_presence_of(:foo)
337
- end
338
- end
339
-
340
- def matcher
341
- validate_presence_of(:attr)
342
- end
343
-
344
- def validating_presence(options = {})
345
- define_model :example, attr: :string do
346
- validates_presence_of :attr, options
347
- end.new
348
- end
349
-
350
- def active_model(&block)
351
- define_active_model_class('Example', accessors: [:attr], &block).new
352
- end
353
-
354
- def active_model_validating_presence
355
- active_model { validates_presence_of :attr }
356
- end
357
-
358
- def has_many_children(options = {})
359
- define_model :child
360
- define_model :parent do
361
- has_many :children
362
- if options[:presence]
363
- validates_presence_of :children
364
- end
365
- end.new
366
- end
367
-
368
- def active_resource_model
369
- define_active_resource_class :foo, attr: :string do
370
- validates_presence_of :attr
371
- end.new
372
- end
373
-
374
- def validation_matcher_scenario_args
375
- super.deep_merge(
376
- matcher_name: :validate_presence_of,
377
- model_creator: :active_record
378
- )
379
- end
380
- end
@@ -1,107 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveRecord::AcceptNestedAttributesForMatcher, type: :model do
4
- it 'accepts an existing declaration' do
5
- expect(accepting_children).to accept_nested_attributes_for(:children)
6
- end
7
-
8
- it 'rejects a missing declaration' do
9
- matcher = children_matcher
10
-
11
- expect(matcher.matches?(rejecting_children)).to eq false
12
-
13
- expect(matcher.failure_message).
14
- to eq 'Expected Parent to accept nested attributes for children (is not declared)'
15
- end
16
-
17
- context 'allow_destroy' do
18
- it 'accepts a valid truthy value' do
19
- matching = accepting_children(allow_destroy: true)
20
-
21
- expect(matching).to children_matcher.allow_destroy(true)
22
- end
23
-
24
- it 'accepts a valid falsey value' do
25
- matching = accepting_children(allow_destroy: false)
26
-
27
- expect(matching).to children_matcher.allow_destroy(false)
28
- end
29
-
30
- it 'rejects an invalid truthy value' do
31
- matcher = children_matcher
32
- matching = accepting_children(allow_destroy: true)
33
-
34
- expect(matcher.allow_destroy(false).matches?(matching)).to eq false
35
- expect(matcher.failure_message).to match(/should not allow destroy/)
36
- end
37
-
38
- it 'rejects an invalid falsey value' do
39
- matcher = children_matcher
40
- matching = accepting_children(allow_destroy: false)
41
-
42
- expect(matcher.allow_destroy(true).matches?(matching)).to eq false
43
- expect(matcher.failure_message).to match(/should allow destroy/)
44
- end
45
- end
46
-
47
- context 'limit' do
48
- it 'accepts a correct value' do
49
- expect(accepting_children(limit: 3)).to children_matcher.limit(3)
50
- end
51
-
52
- it 'rejects a false value' do
53
- matcher = children_matcher
54
- rejecting = accepting_children(limit: 3)
55
-
56
- expect(matcher.limit(2).matches?(rejecting)).to eq false
57
- expect(matcher.failure_message).to match(/limit should be 2, got 3/)
58
- end
59
- end
60
-
61
- context 'update_only' do
62
- it 'accepts a valid truthy value' do
63
- expect(accepting_children(update_only: true)).
64
- to children_matcher.update_only(true)
65
- end
66
-
67
- it 'accepts a valid falsey value' do
68
- expect(accepting_children(update_only: false)).
69
- to children_matcher.update_only(false)
70
- end
71
-
72
- it 'rejects an invalid truthy value' do
73
- matcher = children_matcher.update_only(false)
74
- rejecting = accepting_children(update_only: true)
75
-
76
- expect(matcher.matches?(rejecting)).to eq false
77
- expect(matcher.failure_message).to match(/should not be update only/)
78
- end
79
-
80
- it 'rejects an invalid falsey value' do
81
- matcher = children_matcher.update_only(true)
82
- rejecting = accepting_children(update_only: false)
83
-
84
- expect(matcher.matches?(rejecting)).to eq false
85
- expect(matcher.failure_message).to match(/should be update only/)
86
- end
87
- end
88
-
89
- def accepting_children(options = {})
90
- define_model :child, parent_id: :integer
91
- define_model :parent do
92
- has_many :children
93
- accepts_nested_attributes_for :children, options
94
- end.new
95
- end
96
-
97
- def children_matcher
98
- accept_nested_attributes_for(:children)
99
- end
100
-
101
- def rejecting_children
102
- define_model :child, parent_id: :integer
103
- define_model :parent do
104
- has_many :children
105
- end.new
106
- end
107
- end