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,17 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActionController::SetSessionMatcher, type: :controller do
4
- it_behaves_like 'set session or flash matcher' do
5
- def store_name
6
- 'session'
7
- end
8
-
9
- def set_store
10
- set_session
11
- end
12
-
13
- def store_within(controller)
14
- controller.session
15
- end
16
- end
17
- end
@@ -1,562 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActionController::SetSessionOrFlashMatcher do
4
- context 'without any qualifiers' do
5
- it 'produces the right description' do
6
- store = build_store(name: 'flash')
7
- matcher = described_class.new(store)
8
- expected_description = 'should set any key in flash'
9
-
10
- expect(matcher.description).to eq expected_description
11
- end
12
-
13
- context 'in the positive' do
14
- context 'if the store is not empty' do
15
- it 'accepts' do
16
- controller = define_class('MyController').new
17
- store = build_store(empty?: false)
18
- matcher = described_class.new(store)
19
-
20
- expect(controller).to matcher
21
- end
22
- end
23
-
24
- context 'if the store is empty' do
25
- it 'rejects' do
26
- controller = define_class('MyController').new
27
- store = build_store(empty?: true)
28
- matcher = described_class.new(store)
29
-
30
- expect(controller).not_to matcher
31
- end
32
-
33
- it 'produces the correct failure message' do
34
- controller = define_class('MyController').new
35
- store = build_store(name: 'flash', empty?: true)
36
- matcher = described_class.new(store)
37
- expected_message = 'Expected MyController to set any key in flash, but it did not'
38
-
39
- expect { expect(controller).to matcher }.
40
- to fail_with_message(expected_message)
41
- end
42
- end
43
- end
44
-
45
- context 'in the negative' do
46
- context 'if the given key is present in the store' do
47
- it 'produces the correct failure message' do
48
- controller = define_class('MyController').new
49
- store = build_store(name: 'flash', empty?: false)
50
- matcher = described_class.new(store)
51
- expected_message = 'Expected MyController not to set any key in flash, but it did'
52
-
53
- expect { expect(controller).not_to matcher }.
54
- to fail_with_message(expected_message)
55
- end
56
- end
57
- end
58
- end
59
-
60
- context 'with #[]' do
61
- it 'produces the right description' do
62
- store = build_store(name: 'flash')
63
- matcher = described_class.new(store)['the key']
64
- expected_description = 'should set flash["the key"]'
65
-
66
- expect(matcher.description).to eq expected_description
67
- end
68
-
69
- context 'in the positive' do
70
- context 'if the given key is present in the store' do
71
- it 'accepts' do
72
- controller = define_class('MyController').new
73
- store = build_store
74
- allow(store).to receive(:has_key?).
75
- with('the key').
76
- and_return(true)
77
- matcher = described_class.new(store)['the key']
78
-
79
- expect(controller).to matcher
80
- end
81
- end
82
-
83
- context 'if the given key is not present in the store' do
84
- it 'rejects' do
85
- controller = define_class('MyController').new
86
- store = build_store
87
- allow(store).to receive(:has_key?).
88
- with('the key').
89
- and_return(false)
90
- matcher = described_class.new(store)['the key']
91
-
92
- expect(controller).not_to matcher
93
- end
94
-
95
- it 'produces the correct failure message' do
96
- controller = define_class('MyController').new
97
- store = build_store(name: 'flash')
98
- allow(store).to receive(:has_key?).
99
- with('the key').
100
- and_return(false)
101
- matcher = described_class.new(store)['the key']
102
- expected_message = 'Expected MyController to set flash["the key"], but it did not'
103
-
104
- expect { expect(controller).to matcher }.
105
- to fail_with_message(expected_message)
106
- end
107
- end
108
- end
109
-
110
- context 'in the negative' do
111
- context 'if the given key is present in the store' do
112
- it 'produces the correct failure message' do
113
- controller = define_class('MyController').new
114
- store = build_store(name: 'flash')
115
- allow(store).to receive(:has_key?).
116
- with('the key').
117
- and_return(true)
118
- matcher = described_class.new(store)['the key']
119
- expected_message = 'Expected MyController not to set flash["the key"], but it did'
120
-
121
- expect { expect(controller).not_to matcher }.
122
- to fail_with_message(expected_message)
123
- end
124
- end
125
- end
126
- end
127
-
128
- context 'with #to' do
129
- context 'given a static value' do
130
- it 'produces the right description' do
131
- store = build_store(name: 'flash')
132
- matcher = described_class.new(store).to('the value')
133
- expected_description = 'should set any key in flash to "the value"'
134
-
135
- expect(matcher.description).to eq expected_description
136
- end
137
-
138
- context 'in the positive' do
139
- context 'if the given value is present in the store' do
140
- it 'accepts' do
141
- controller = define_class('MyController').new
142
- store = build_store
143
- allow(store).to receive(:has_value?).
144
- with('the value').
145
- and_return(true)
146
- matcher = described_class.new(store).to('the value')
147
-
148
- expect(controller).to matcher
149
- end
150
-
151
- it 'accepts given a value of nil' do
152
- controller = define_class('MyController').new
153
- store = build_store
154
- allow(store).to receive(:has_value?).
155
- with(nil).
156
- and_return(true)
157
- matcher = described_class.new(store).to(nil)
158
-
159
- expect(controller).to matcher
160
- end
161
-
162
- it 'accepts given a value of false' do
163
- controller = define_class('MyController').new
164
- store = build_store
165
- allow(store).to receive(:has_value?).
166
- with(false).
167
- and_return(true)
168
- matcher = described_class.new(store).to(false)
169
-
170
- expect(controller).to matcher
171
- end
172
- end
173
-
174
- context 'if the given value is not present in the store' do
175
- it 'rejects' do
176
- controller = define_class('MyController').new
177
- store = build_store
178
- allow(store).to receive(:has_value?).
179
- with('the value').
180
- and_return(false)
181
- matcher = described_class.new(store).to('the value')
182
-
183
- expect(controller).not_to matcher
184
- end
185
-
186
- it 'produces the correct failure message' do
187
- controller = define_class('MyController').new
188
- store = build_store(name: 'flash')
189
- allow(store).to receive(:has_value?).
190
- with('the value').
191
- and_return(false)
192
- matcher = described_class.new(store).to('the value')
193
- expected_message = 'Expected MyController to set any key in flash to "the value", but it did not'
194
-
195
- expect { expect(controller).to matcher }.
196
- to fail_with_message(expected_message)
197
- end
198
- end
199
- end
200
-
201
- context 'in the negative' do
202
- context 'if the given value is present in the store' do
203
- it 'produces the correct failure message' do
204
- controller = define_class('MyController').new
205
- store = build_store(name: 'flash')
206
- allow(store).to receive(:has_value?).
207
- with('the value').
208
- and_return(true)
209
- matcher = described_class.new(store).to('the value')
210
- expected_message = 'Expected MyController not to set any key in flash to "the value", but it did'
211
-
212
- expect { expect(controller).not_to matcher }.
213
- to fail_with_message(expected_message)
214
- end
215
- end
216
- end
217
- end
218
-
219
- context 'given a regexp' do
220
- it 'produces the right description' do
221
- store = build_store(name: 'flash')
222
- matcher = described_class.new(store).to(/the value/)
223
- expected_description = 'should set any key in flash to a value matching /the value/'
224
-
225
- expect(matcher.description).to eq expected_description
226
- end
227
-
228
- context 'in the positive' do
229
- context 'if the given value is present in the store' do
230
- it 'accepts' do
231
- controller = define_class('MyController').new
232
- store = build_store
233
- allow(store).to receive(:has_value?).
234
- with(/the value/).
235
- and_return(true)
236
- matcher = described_class.new(store).to(/the value/)
237
-
238
- expect(controller).to matcher
239
- end
240
- end
241
-
242
- context 'if the given value is not present in the store' do
243
- it 'rejects' do
244
- controller = define_class('MyController').new
245
- store = build_store
246
- allow(store).to receive(:has_value?).
247
- with(/the value/).
248
- and_return(false)
249
- matcher = described_class.new(store).to(/the value/)
250
-
251
- expect(controller).not_to matcher
252
- end
253
-
254
- it 'produces the correct failure message' do
255
- controller = define_class('MyController').new
256
- store = build_store(name: 'flash')
257
- allow(store).to receive(:has_value?).
258
- with(/the value/).
259
- and_return(false)
260
- matcher = described_class.new(store).to(/the value/)
261
- expected_message = 'Expected MyController to set any key in flash to a value matching /the value/, but it did not'
262
-
263
- expect { expect(controller).to matcher }.
264
- to fail_with_message(expected_message)
265
- end
266
- end
267
- end
268
-
269
- context 'in the negative' do
270
- context 'if the given value is present in the store' do
271
- it 'produces the correct failure message' do
272
- controller = define_class('MyController').new
273
- store = build_store(name: 'flash')
274
- allow(store).to receive(:has_value?).
275
- with(/the value/).
276
- and_return(true)
277
- matcher = described_class.new(store).to(/the value/)
278
- expected_message = 'Expected MyController not to set any key in flash to a value matching /the value/, but it did'
279
-
280
- expect { expect(controller).not_to matcher }.
281
- to fail_with_message(expected_message)
282
- end
283
- end
284
- end
285
- end
286
-
287
- context 'given a dynamic value' do
288
- it 'produces the right description' do
289
- store = build_store(name: 'flash')
290
- context = double('context', method_in_context: 'the value')
291
- matcher = described_class.new(store).
292
- in_context(context).
293
- to { method_in_context }
294
- expected_description = 'should set any key in flash to "the value"'
295
-
296
- expect(matcher.description).to eq expected_description
297
- end
298
-
299
- it 'requires in_context to be specified beforehand' do
300
- store = build_store(name: 'flash')
301
- matcher = described_class.new(store)
302
- expected_message = 'When specifying a value as a block, a context must be specified beforehand, e.g., flash.in_context(context).to { ... }'
303
-
304
- expect { matcher.to { whatever } }.
305
- to raise_error(ArgumentError, expected_message)
306
- end
307
-
308
- context 'in the positive' do
309
- context 'if the value evaluated in the context is present in the store' do
310
- it 'accepts' do
311
- controller = define_class('MyController').new
312
- store = build_store
313
- allow(store).to receive(:has_value?).
314
- with('the value').
315
- and_return(true)
316
- context = double('context', method_in_context: 'the value')
317
- matcher = described_class.new(store).
318
- in_context(context).
319
- to { method_in_context }
320
-
321
- expect(controller).to matcher
322
- end
323
- end
324
-
325
- context 'if the value evaluated in the context is not present in the store' do
326
- it 'rejects' do
327
- controller = define_class('MyController').new
328
- store = build_store
329
- allow(store).to receive(:has_value?).
330
- with('the value').
331
- and_return(false)
332
- context = double('context', method_in_context: 'the value')
333
- matcher = described_class.new(store).
334
- in_context(context).
335
- to { method_in_context }
336
-
337
- expect(controller).not_to matcher
338
- end
339
-
340
- it 'produces the correct failure message' do
341
- controller = define_class('MyController').new
342
- store = build_store(name: 'flash')
343
- allow(store).to receive(:has_value?).
344
- with('the value').
345
- and_return(false)
346
- context = double('context', method_in_context: 'the value')
347
- matcher = described_class.new(store).
348
- in_context(context).
349
- to { method_in_context }
350
- expected_message = 'Expected MyController to set any key in flash to "the value", but it did not'
351
-
352
- expect { expect(controller).to matcher }.
353
- to fail_with_message(expected_message)
354
- end
355
- end
356
- end
357
-
358
- context 'in the negative' do
359
- context 'if the value evaluated in the context is present in the store' do
360
- it 'produces the correct failure message' do
361
- controller = define_class('MyController').new
362
- store = build_store(name: 'flash')
363
- allow(store).to receive(:has_value?).
364
- with('the value').
365
- and_return(true)
366
- context = double('context', method_in_context: 'the value')
367
- matcher = described_class.new(store).
368
- in_context(context).
369
- to { method_in_context }
370
- expected_message = 'Expected MyController not to set any key in flash to "the value", but it did'
371
-
372
- expect { expect(controller).not_to matcher }.
373
- to fail_with_message(expected_message)
374
- end
375
- end
376
- end
377
- end
378
- end
379
-
380
- context 'with #[] + #to' do
381
- context 'given a static value' do
382
- it 'produces the right description' do
383
- store = build_store(name: 'flash')
384
- matcher = described_class.new(store)['the key'].to('the value')
385
- expected_description = 'should set flash["the key"] to "the value"'
386
-
387
- expect(matcher.description).to eq expected_description
388
- end
389
-
390
- context 'in the positive' do
391
- context 'if the given value is present in the store' do
392
- it 'accepts' do
393
- controller = define_class('MyController').new
394
- store = build_store
395
- allow(store).to receive(:has_key?).
396
- with('the key').
397
- and_return(true)
398
- allow(store).to receive(:has_value?).
399
- with('the value').
400
- and_return(true)
401
- matcher = described_class.new(store)['the key'].to('the value')
402
-
403
- expect(controller).to matcher
404
- end
405
- end
406
-
407
- context 'if the given value is not present in the store' do
408
- it 'rejects' do
409
- controller = define_class('MyController').new
410
- store = build_store
411
- allow(store).to receive(:has_key?).
412
- with('the key').
413
- and_return(true)
414
- allow(store).to receive(:has_value?).
415
- with('the value').
416
- and_return(false)
417
- matcher = described_class.new(store)['the key'].to('the value')
418
-
419
- expect(controller).not_to matcher
420
- end
421
-
422
- it 'produces the correct failure message' do
423
- controller = define_class('MyController').new
424
- store = build_store(name: 'flash')
425
- allow(store).to receive(:has_key?).
426
- with('the key').
427
- and_return(true)
428
- allow(store).to receive(:has_value?).
429
- with('the value').
430
- and_return(false)
431
- matcher = described_class.new(store)['the key'].to('the value')
432
- expected_message = 'Expected MyController to set flash["the key"] to "the value", but it did not'
433
-
434
- expect { expect(controller).to matcher }.
435
- to fail_with_message(expected_message)
436
- end
437
- end
438
- end
439
-
440
- context 'in the negative' do
441
- context 'if the given value is present in the store' do
442
- it 'produces the correct failure message' do
443
- controller = define_class('MyController').new
444
- store = build_store(name: 'flash')
445
- allow(store).to receive(:has_key?).
446
- with('the key').
447
- and_return(true)
448
- allow(store).to receive(:has_value?).
449
- with('the value').
450
- and_return(true)
451
- matcher = described_class.new(store)['the key'].to('the value')
452
- expected_message = 'Expected MyController not to set flash["the key"] to "the value", but it did'
453
-
454
- expect { expect(controller).not_to matcher }.
455
- to fail_with_message(expected_message)
456
- end
457
- end
458
- end
459
- end
460
-
461
- context 'given a dynamic value' do
462
- it 'produces the right description' do
463
- store = build_store(name: 'flash')
464
- context = double('context', method_in_context: 'the value')
465
- matcher = described_class.new(store)['the key'].
466
- in_context(context).
467
- to { method_in_context }
468
- expected_description = 'should set flash["the key"] to "the value"'
469
-
470
- expect(matcher.description).to eq expected_description
471
- end
472
-
473
- context 'in the positive' do
474
- context 'if the value evaluated in the context is present in the store' do
475
- it 'accepts' do
476
- controller = define_class('MyController').new
477
- store = build_store
478
- allow(store).to receive(:has_key?).
479
- with('the key').
480
- and_return(true)
481
- allow(store).to receive(:has_value?).
482
- with('the value').
483
- and_return(true)
484
- context = double('context', method_in_context: 'the value')
485
- matcher = described_class.new(store)['the key'].
486
- in_context(context).
487
- to { method_in_context }
488
-
489
- expect(controller).to matcher
490
- end
491
- end
492
-
493
- context 'if the value evaluated in the context is not present in the store' do
494
- it 'rejects' do
495
- controller = define_class('MyController').new
496
- store = build_store
497
- allow(store).to receive(:has_key?).
498
- with('the key').
499
- and_return(false)
500
- context = double('context', method_in_context: 'the value')
501
- matcher = described_class.new(store)['the key'].
502
- in_context(context).
503
- to { method_in_context }
504
-
505
- expect(controller).not_to matcher
506
- end
507
-
508
- it 'produces the correct failure message' do
509
- controller = define_class('MyController').new
510
- store = build_store(name: 'flash')
511
- allow(store).to receive(:has_key?).
512
- with('the key').
513
- and_return(false)
514
- context = double('context', method_in_context: 'the value')
515
- matcher = described_class.new(store)['the key'].
516
- in_context(context).
517
- to { method_in_context }
518
- expected_message = 'Expected MyController to set flash["the key"] to "the value", but it did not'
519
-
520
- expect { expect(controller).to matcher }.
521
- to fail_with_message(expected_message)
522
- end
523
- end
524
- end
525
-
526
- context 'in the negative' do
527
- context 'if the value evaluated in the context is present in the store' do
528
- it 'produces the correct failure message' do
529
- controller = define_class('MyController').new
530
- store = build_store(name: 'flash')
531
- allow(store).to receive(:has_key?).
532
- with('the key').
533
- and_return(true)
534
- allow(store).to receive(:has_value?).
535
- with('the value').
536
- and_return(true)
537
- context = double('context', method_in_context: 'the value')
538
- matcher = described_class.new(store)['the key'].
539
- in_context(context).
540
- to { method_in_context }
541
- expected_message = 'Expected MyController not to set flash["the key"] to "the value", but it did'
542
-
543
- expect { expect(controller).not_to matcher }.
544
- to fail_with_message(expected_message)
545
- end
546
- end
547
- end
548
- end
549
- end
550
-
551
- def build_store(overrides = {})
552
- defaults = {
553
- :name => 'store',
554
- :controller= => nil,
555
- :has_key? => nil,
556
- :has_value? => nil,
557
- :empty? => nil,
558
- }
559
- methods = defaults.merge(overrides)
560
- double('store', methods)
561
- end
562
- end
@@ -1,115 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveModel::AllowMassAssignmentOfMatcher, type: :model do
4
- context '#description' do
5
- context 'without a role' do
6
- it 'includes the attribute name' do
7
- expect(described_class.new(:attr).description).
8
- to eq 'allow mass assignment of attr'
9
- end
10
- end
11
-
12
- if active_model_3_1?
13
- context 'with a role' do
14
- it 'includes the attribute name and the role' do
15
- expect(described_class.new(:attr).as(:admin).description).
16
- to eq 'allow mass assignment of attr as admin'
17
- end
18
- end
19
- end
20
- end
21
-
22
- context 'an attribute that is blacklisted from mass-assignment' do
23
- it 'rejects being mass-assignable' do
24
- model = define_model(:example, blacklisted: :string) do
25
- attr_protected :blacklisted
26
- end.new
27
-
28
- expect(model).not_to allow_mass_assignment_of(:blacklisted)
29
- end
30
- end
31
-
32
- context 'an attribute that is not whitelisted for mass-assignment' do
33
- it 'rejects being mass-assignable' do
34
- model = define_model(:example, not_whitelisted: :string,
35
- whitelisted: :string) do
36
- attr_accessible :whitelisted
37
- end.new
38
-
39
- expect(model).not_to allow_mass_assignment_of(:not_whitelisted)
40
- end
41
- end
42
-
43
- context 'an attribute that is whitelisted for mass-assignment' do
44
- it 'accepts being mass-assignable' do
45
- expect(define_model(:example, whitelisted: :string) do
46
- attr_accessible :whitelisted
47
- end.new).to allow_mass_assignment_of(:whitelisted)
48
- end
49
- end
50
-
51
- context 'an attribute not included in the mass-assignment blacklist' do
52
- it 'accepts being mass-assignable' do
53
- model = define_model(:example, not_blacklisted: :string,
54
- blacklisted: :string) do
55
- attr_protected :blacklisted
56
- end.new
57
-
58
- expect(model).to allow_mass_assignment_of(:not_blacklisted)
59
- end
60
- end
61
-
62
- unless active_model_3_2? || active_model_4_0?
63
- context 'an attribute on a class with no protected attributes' do
64
- it 'accepts being mass-assignable' do
65
- expect(no_protected_attributes).to allow_mass_assignment_of(:attr)
66
- end
67
-
68
- it 'assigns a negative failure message' do
69
- matcher = allow_mass_assignment_of(:attr)
70
-
71
- expect(matcher.matches?(no_protected_attributes)).to eq true
72
-
73
- expect(matcher.failure_message_when_negated).not_to be_nil
74
- end
75
- end
76
-
77
- def no_protected_attributes
78
- define_model(:example, attr: :string).new
79
- end
80
- end
81
-
82
- context 'an attribute on a class with all protected attributes' do
83
- it 'rejects being mass-assignable' do
84
- expect(all_protected_attributes).not_to allow_mass_assignment_of(:attr)
85
- end
86
-
87
- def all_protected_attributes
88
- define_model(:example, attr: :string) do
89
- attr_accessible nil
90
- end.new
91
- end
92
- end
93
-
94
- if active_model_3_1?
95
- context 'an attribute included in the mass-assignment whitelist for admin role only' do
96
- it 'rejects being mass-assignable' do
97
- expect(mass_assignable_as_admin).not_to allow_mass_assignment_of(:attr)
98
- end
99
-
100
- it 'accepts being mass-assignable for admin' do
101
- expect(mass_assignable_as_admin).to allow_mass_assignment_of(:attr).as(:admin)
102
- end
103
-
104
- def mass_assignable_as_admin
105
- define_model(:example, attr: :string) do
106
- attr_accessible :attr, as: :admin
107
- end.new
108
- end
109
- end
110
- end
111
-
112
- def define_model(name, columns, &block)
113
- super(name, columns, whitelist_attributes: false, &block)
114
- end
115
- end