shoulda-matchers 3.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (288) hide show
  1. checksums.yaml +5 -5
  2. data/{MIT-LICENSE → LICENSE} +1 -1
  3. data/README.md +407 -232
  4. data/docs/errors/NonCaseSwappableValueError.md +2 -2
  5. data/lib/shoulda/matchers/action_controller/callback_matcher.rb +7 -80
  6. data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +4 -3
  7. data/lib/shoulda/matchers/action_controller/flash_store.rb +2 -4
  8. data/lib/shoulda/matchers/action_controller/permit_matcher.rb +36 -30
  9. data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +8 -10
  10. data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +7 -9
  11. data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +18 -15
  12. data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +3 -2
  13. data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +3 -3
  14. data/lib/shoulda/matchers/action_controller/route_matcher.rb +88 -29
  15. data/lib/shoulda/matchers/action_controller/route_params.rb +2 -2
  16. data/lib/shoulda/matchers/action_controller/set_flash_matcher.rb +4 -4
  17. data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -3
  18. data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +19 -13
  19. data/lib/shoulda/matchers/action_controller.rb +2 -0
  20. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +1 -1
  21. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +5 -9
  22. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +2 -2
  23. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +1 -1
  24. data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +1 -1
  25. data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +42 -39
  26. data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +1 -1
  27. data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +52 -26
  28. data/lib/shoulda/matchers/active_model/helpers.rb +2 -2
  29. data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -30
  30. data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +2 -1
  31. data/lib/shoulda/matchers/active_model/qualifiers/allow_blank.rb +26 -0
  32. data/lib/shoulda/matchers/active_model/qualifiers/allow_nil.rb +26 -0
  33. data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +1 -1
  34. data/lib/shoulda/matchers/active_model/qualifiers.rb +2 -0
  35. data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +30 -6
  36. data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +8 -3
  37. data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +31 -16
  38. data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +52 -16
  39. data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +137 -84
  40. data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +159 -46
  41. data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +130 -66
  42. data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +251 -24
  43. data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +12 -9
  44. data/lib/shoulda/matchers/active_model/validation_matcher.rb +38 -6
  45. data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -4
  46. data/lib/shoulda/matchers/active_model/validator.rb +4 -9
  47. data/lib/shoulda/matchers/active_model.rb +3 -5
  48. data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +10 -7
  49. data/lib/shoulda/matchers/active_record/association_matcher.rb +386 -111
  50. data/lib/shoulda/matchers/active_record/association_matchers/counter_cache_matcher.rb +5 -2
  51. data/lib/shoulda/matchers/active_record/association_matchers/dependent_matcher.rb +4 -4
  52. data/lib/shoulda/matchers/active_record/association_matchers/inverse_of_matcher.rb +1 -1
  53. data/lib/shoulda/matchers/active_record/association_matchers/join_table_matcher.rb +11 -6
  54. data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +14 -15
  55. data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +30 -8
  56. data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +34 -11
  57. data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +69 -0
  58. data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +1 -1
  59. data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +74 -0
  60. data/lib/shoulda/matchers/active_record/association_matchers/source_matcher.rb +3 -2
  61. data/lib/shoulda/matchers/active_record/association_matchers/through_matcher.rb +7 -5
  62. data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +458 -42
  63. data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +185 -0
  64. data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +63 -23
  65. data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +164 -48
  66. data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +106 -0
  67. data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +13 -11
  68. data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +83 -0
  69. data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +132 -0
  70. data/lib/shoulda/matchers/active_record/serialize_matcher.rb +18 -18
  71. data/lib/shoulda/matchers/active_record/uniqueness/test_model_creator.rb +1 -3
  72. data/lib/shoulda/matchers/active_record/uniqueness/test_models.rb +0 -2
  73. data/lib/shoulda/matchers/active_record/uniqueness.rb +1 -1
  74. data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +430 -200
  75. data/lib/shoulda/matchers/active_record.rb +28 -20
  76. data/lib/shoulda/matchers/configuration.rb +12 -1
  77. data/lib/shoulda/matchers/doublespeak/double.rb +1 -1
  78. data/lib/shoulda/matchers/doublespeak/double_collection.rb +3 -3
  79. data/lib/shoulda/matchers/doublespeak/double_implementation_registry.rb +8 -5
  80. data/lib/shoulda/matchers/doublespeak/object_double.rb +6 -2
  81. data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +1 -5
  82. data/lib/shoulda/matchers/doublespeak/world.rb +2 -2
  83. data/lib/shoulda/matchers/doublespeak.rb +2 -1
  84. data/lib/shoulda/matchers/error.rb +1 -1
  85. data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +109 -29
  86. data/lib/shoulda/matchers/independent.rb +2 -2
  87. data/lib/shoulda/matchers/integrations/configuration.rb +8 -4
  88. data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +1 -1
  89. data/lib/shoulda/matchers/integrations/libraries/rails.rb +2 -2
  90. data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +1 -1
  91. data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +1 -1
  92. data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +1 -1
  93. data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +1 -1
  94. data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +1 -1
  95. data/lib/shoulda/matchers/rails_shim.rb +172 -51
  96. data/lib/shoulda/matchers/routing.rb +2 -2
  97. data/lib/shoulda/matchers/util/word_wrap.rb +17 -12
  98. data/lib/shoulda/matchers/util.rb +39 -5
  99. data/lib/shoulda/matchers/version.rb +1 -1
  100. data/lib/shoulda/matchers/warn.rb +4 -3
  101. data/shoulda-matchers.gemspec +33 -15
  102. metadata +31 -338
  103. data/.gitignore +0 -12
  104. data/.hound.yml +0 -3
  105. data/.hound_config/ruby.yml +0 -12
  106. data/.travis.yml +0 -19
  107. data/.yardopts +0 -10
  108. data/Appraisals +0 -73
  109. data/CONTRIBUTING.md +0 -101
  110. data/Gemfile +0 -15
  111. data/Gemfile.lock +0 -70
  112. data/NEWS.md +0 -986
  113. data/Rakefile +0 -39
  114. data/custom_plan.rb +0 -88
  115. data/doc_config/gh-pages/index.html.erb +0 -9
  116. data/doc_config/yard/setup.rb +0 -22
  117. data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +0 -5967
  118. data/doc_config/yard/templates/default/fulldoc/html/css/full_list.css +0 -12
  119. data/doc_config/yard/templates/default/fulldoc/html/css/global.css +0 -62
  120. data/doc_config/yard/templates/default/fulldoc/html/css/solarized.css +0 -69
  121. data/doc_config/yard/templates/default/fulldoc/html/css/style.css +0 -312
  122. data/doc_config/yard/templates/default/fulldoc/html/full_list.erb +0 -32
  123. data/doc_config/yard/templates/default/fulldoc/html/full_list_class.erb +0 -1
  124. data/doc_config/yard/templates/default/fulldoc/html/full_list_method.erb +0 -8
  125. data/doc_config/yard/templates/default/fulldoc/html/js/app.js +0 -298
  126. data/doc_config/yard/templates/default/fulldoc/html/js/full_list.js +0 -1
  127. data/doc_config/yard/templates/default/fulldoc/html/js/jquery.stickyheaders.js +0 -289
  128. data/doc_config/yard/templates/default/fulldoc/html/js/underscore.min.js +0 -6
  129. data/doc_config/yard/templates/default/fulldoc/html/setup.rb +0 -8
  130. data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +0 -14
  131. data/doc_config/yard/templates/default/layout/html/fonts.erb +0 -1
  132. data/doc_config/yard/templates/default/layout/html/footer.erb +0 -6
  133. data/doc_config/yard/templates/default/layout/html/layout.erb +0 -23
  134. data/doc_config/yard/templates/default/layout/html/search.erb +0 -13
  135. data/doc_config/yard/templates/default/layout/html/setup.rb +0 -40
  136. data/doc_config/yard/templates/default/method_details/html/source.erb +0 -10
  137. data/doc_config/yard/templates/default/module/html/box_info.erb +0 -31
  138. data/gemfiles/4.0.0.gemfile +0 -38
  139. data/gemfiles/4.0.0.gemfile.lock +0 -223
  140. data/gemfiles/4.0.1.gemfile +0 -38
  141. data/gemfiles/4.0.1.gemfile.lock +0 -225
  142. data/gemfiles/4.1.gemfile +0 -38
  143. data/gemfiles/4.1.gemfile.lock +0 -220
  144. data/gemfiles/4.2.gemfile +0 -38
  145. data/gemfiles/4.2.gemfile.lock +0 -243
  146. data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +0 -159
  147. data/lib/shoulda/matchers/independent/delegate_method_matcher/stubbed_target.rb +0 -37
  148. data/script/SUPPORTED_VERSIONS +0 -1
  149. data/script/install_gems_in_all_appraisals +0 -14
  150. data/script/run_all_tests +0 -14
  151. data/script/update_gem_in_all_appraisals +0 -15
  152. data/script/update_gems_in_all_appraisals +0 -14
  153. data/spec/acceptance/active_model_integration_spec.rb +0 -23
  154. data/spec/acceptance/independent_matchers_spec.rb +0 -125
  155. data/spec/acceptance/multiple_libraries_integration_spec.rb +0 -55
  156. data/spec/acceptance/rails_integration_spec.rb +0 -156
  157. data/spec/acceptance_spec_helper.rb +0 -23
  158. data/spec/doublespeak_spec_helper.rb +0 -2
  159. data/spec/report_warnings.rb +0 -7
  160. data/spec/spec_helper.rb +0 -21
  161. data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +0 -133
  162. data/spec/support/acceptance/helpers/active_model_helpers.rb +0 -11
  163. data/spec/support/acceptance/helpers/array_helpers.rb +0 -13
  164. data/spec/support/acceptance/helpers/base_helpers.rb +0 -19
  165. data/spec/support/acceptance/helpers/command_helpers.rb +0 -55
  166. data/spec/support/acceptance/helpers/file_helpers.rb +0 -19
  167. data/spec/support/acceptance/helpers/gem_helpers.rb +0 -31
  168. data/spec/support/acceptance/helpers/minitest_helpers.rb +0 -11
  169. data/spec/support/acceptance/helpers/n_unit_helpers.rb +0 -25
  170. data/spec/support/acceptance/helpers/pluralization_helpers.rb +0 -13
  171. data/spec/support/acceptance/helpers/rails_version_helpers.rb +0 -11
  172. data/spec/support/acceptance/helpers/rspec_helpers.rb +0 -24
  173. data/spec/support/acceptance/helpers/ruby_version_helpers.rb +0 -9
  174. data/spec/support/acceptance/helpers/step_helpers.rb +0 -127
  175. data/spec/support/acceptance/helpers.rb +0 -31
  176. data/spec/support/acceptance/matchers/have_output.rb +0 -31
  177. data/spec/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +0 -55
  178. data/spec/support/acceptance/matchers/indicate_that_tests_were_run_matcher.rb +0 -103
  179. data/spec/support/tests/bundle.rb +0 -94
  180. data/spec/support/tests/command_runner.rb +0 -230
  181. data/spec/support/tests/current_bundle.rb +0 -61
  182. data/spec/support/tests/database.rb +0 -28
  183. data/spec/support/tests/database_adapters/postgresql.rb +0 -25
  184. data/spec/support/tests/database_adapters/sqlite3.rb +0 -26
  185. data/spec/support/tests/database_configuration.rb +0 -33
  186. data/spec/support/tests/database_configuration_registry.rb +0 -28
  187. data/spec/support/tests/filesystem.rb +0 -100
  188. data/spec/support/tests/version.rb +0 -45
  189. data/spec/support/unit/active_record/create_table.rb +0 -54
  190. data/spec/support/unit/attribute.rb +0 -47
  191. data/spec/support/unit/capture.rb +0 -40
  192. data/spec/support/unit/change_value.rb +0 -111
  193. data/spec/support/unit/create_model_arguments/basic.rb +0 -135
  194. data/spec/support/unit/create_model_arguments/has_many.rb +0 -15
  195. data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +0 -74
  196. data/spec/support/unit/helpers/active_model_helpers.rb +0 -27
  197. data/spec/support/unit/helpers/active_model_versions.rb +0 -28
  198. data/spec/support/unit/helpers/active_record_versions.rb +0 -24
  199. data/spec/support/unit/helpers/active_resource_builder.rb +0 -27
  200. data/spec/support/unit/helpers/allow_value_matcher_helpers.rb +0 -15
  201. data/spec/support/unit/helpers/class_builder.rb +0 -90
  202. data/spec/support/unit/helpers/column_type_helpers.rb +0 -26
  203. data/spec/support/unit/helpers/confirmation_matcher_helpers.rb +0 -17
  204. data/spec/support/unit/helpers/controller_builder.rb +0 -63
  205. data/spec/support/unit/helpers/database_helpers.rb +0 -20
  206. data/spec/support/unit/helpers/i18n_faker.rb +0 -15
  207. data/spec/support/unit/helpers/mailer_builder.rb +0 -12
  208. data/spec/support/unit/helpers/model_builder.rb +0 -114
  209. data/spec/support/unit/helpers/rails_versions.rb +0 -28
  210. data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +0 -44
  211. data/spec/support/unit/i18n.rb +0 -7
  212. data/spec/support/unit/load_environment.rb +0 -12
  213. data/spec/support/unit/matchers/deprecate.rb +0 -60
  214. data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +0 -51
  215. data/spec/support/unit/matchers/fail_with_message_matcher.rb +0 -62
  216. data/spec/support/unit/matchers/print_warning_including.rb +0 -59
  217. data/spec/support/unit/model_creation_strategies/active_model.rb +0 -111
  218. data/spec/support/unit/model_creation_strategies/active_record.rb +0 -77
  219. data/spec/support/unit/model_creators/active_model.rb +0 -39
  220. data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +0 -95
  221. data/spec/support/unit/model_creators/active_record/has_many.rb +0 -67
  222. data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +0 -42
  223. data/spec/support/unit/model_creators/active_record.rb +0 -43
  224. data/spec/support/unit/model_creators/basic.rb +0 -97
  225. data/spec/support/unit/model_creators.rb +0 -19
  226. data/spec/support/unit/rails_application.rb +0 -126
  227. data/spec/support/unit/record_builder_with_i18n_validation_message.rb +0 -69
  228. data/spec/support/unit/record_validating_confirmation_builder.rb +0 -51
  229. data/spec/support/unit/record_with_different_error_attribute_builder.rb +0 -92
  230. data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +0 -79
  231. data/spec/support/unit/shared_examples/numerical_submatcher.rb +0 -17
  232. data/spec/support/unit/shared_examples/set_session_or_flash.rb +0 -360
  233. data/spec/support/unit/validation_matcher_scenario.rb +0 -62
  234. data/spec/unit/shoulda/matchers/action_controller/callback_matcher_spec.rb +0 -82
  235. data/spec/unit/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +0 -28
  236. data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +0 -592
  237. data/spec/unit/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +0 -42
  238. data/spec/unit/shoulda/matchers/action_controller/render_template_matcher_spec.rb +0 -76
  239. data/spec/unit/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +0 -62
  240. data/spec/unit/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +0 -90
  241. data/spec/unit/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +0 -31
  242. data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +0 -330
  243. data/spec/unit/shoulda/matchers/action_controller/route_params_spec.rb +0 -30
  244. data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +0 -67
  245. data/spec/unit/shoulda/matchers/action_controller/set_session_matcher_spec.rb +0 -17
  246. data/spec/unit/shoulda/matchers/action_controller/set_session_or_flash_matcher_spec.rb +0 -562
  247. data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
  248. data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +0 -823
  249. data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +0 -86
  250. data/spec/unit/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +0 -20
  251. data/spec/unit/shoulda/matchers/active_model/helpers_spec.rb +0 -162
  252. data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +0 -266
  253. data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +0 -91
  254. data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +0 -149
  255. data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +0 -207
  256. data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +0 -1015
  257. data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +0 -288
  258. data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +0 -1837
  259. data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +0 -380
  260. data/spec/unit/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -107
  261. data/spec/unit/shoulda/matchers/active_record/association_matcher_spec.rb +0 -1242
  262. data/spec/unit/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +0 -251
  263. data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +0 -168
  264. data/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +0 -111
  265. data/spec/unit/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +0 -85
  266. data/spec/unit/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +0 -41
  267. data/spec/unit/shoulda/matchers/active_record/serialize_matcher_spec.rb +0 -86
  268. data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +0 -1418
  269. data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +0 -190
  270. data/spec/unit/shoulda/matchers/doublespeak/double_implementation_registry_spec.rb +0 -21
  271. data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +0 -271
  272. data/spec/unit/shoulda/matchers/doublespeak/object_double_spec.rb +0 -77
  273. data/spec/unit/shoulda/matchers/doublespeak/proxy_implementation_spec.rb +0 -72
  274. data/spec/unit/shoulda/matchers/doublespeak/stub_implementation_spec.rb +0 -101
  275. data/spec/unit/shoulda/matchers/doublespeak/world_spec.rb +0 -80
  276. data/spec/unit/shoulda/matchers/doublespeak_spec.rb +0 -27
  277. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher/stubbed_target_spec.rb +0 -43
  278. data/spec/unit/shoulda/matchers/independent/delegate_method_matcher_spec.rb +0 -517
  279. data/spec/unit/shoulda/matchers/routing/route_matcher_spec.rb +0 -242
  280. data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +0 -252
  281. data/spec/unit_spec_helper.rb +0 -46
  282. data/spec/warnings_spy/filesystem.rb +0 -45
  283. data/spec/warnings_spy/partitioner.rb +0 -36
  284. data/spec/warnings_spy/reader.rb +0 -53
  285. data/spec/warnings_spy/reporter.rb +0 -88
  286. data/spec/warnings_spy.rb +0 -64
  287. data/tasks/documentation.rb +0 -199
  288. data/zeus.json +0 -11
@@ -1,251 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveRecord::AssociationMatchers::ModelReflection do
4
- it 'delegates other methods to the given Reflection object' do
5
- define_model(:country)
6
- person_model = define_model(:person, country_id: :integer) do
7
- belongs_to :country
8
- end
9
- delegate_reflection = person_model.reflect_on_association(:country)
10
- allow(delegate_reflection).to receive(:foo).and_return('bar')
11
- reflection = described_class.new(delegate_reflection)
12
-
13
- expect(reflection.foo).to eq 'bar'
14
- end
15
-
16
- describe '#associated_class' do
17
- it 'returns the model that the association refers to' do
18
- define_model(:country)
19
- person_model = define_model(:person, country_id: :integer) do
20
- belongs_to :country
21
- end
22
- delegate_reflection = person_model.reflect_on_association(:country)
23
- reflection = described_class.new(delegate_reflection)
24
-
25
- expect(reflection.associated_class).to be Country
26
- end
27
- end
28
-
29
- describe '#through?' do
30
- it 'returns true if the reflection is for a has_many :through association' do
31
- define_model(:city, person_id: :integer)
32
- define_model(:person, country_id: :integer) do
33
- has_many :cities
34
- end
35
- country_model = define_model(:country) do
36
- has_many :people
37
- has_many :cities, through: :people
38
- end
39
- delegate_reflection = country_model.reflect_on_association(:cities)
40
- reflection = described_class.new(delegate_reflection)
41
-
42
- expect(reflection).to be_through
43
- end
44
-
45
- it 'returns false if not' do
46
- define_model(:person, country_id: :integer)
47
- country_model = define_model(:country) do
48
- has_many :people
49
- end
50
- delegate_reflection = country_model.reflect_on_association(:people)
51
- reflection = described_class.new(delegate_reflection)
52
-
53
- expect(reflection).not_to be_through
54
- end
55
- end
56
-
57
- describe '#join_table_name' do
58
- context 'when the association was defined with a :join_table option' do
59
- it 'returns the value of the option' do
60
- create_table :foos, id: false do |t|
61
- t.integer :person_id
62
- t.integer :country_id
63
- end
64
- define_model(:person, country_id: :integer)
65
- country_model = define_model(:country) do
66
- has_and_belongs_to_many :people, join_table: 'foos'
67
- end
68
- delegate_reflection = country_model.reflect_on_association(:people)
69
- reflection = described_class.new(delegate_reflection)
70
-
71
- expect(reflection.join_table_name).to eq 'foos'
72
- end
73
- end
74
-
75
- context 'when the association was not defined with :join_table' do
76
- it 'returns the default join_table that ActiveRecord generates' do
77
- define_model(:person, country_id: :integer)
78
- country_model = define_model(:country) do
79
- has_and_belongs_to_many :people
80
- end
81
- delegate_reflection = country_model.reflect_on_association(:people)
82
- reflection = described_class.new(delegate_reflection)
83
-
84
- expect(reflection.join_table_name).to eq 'countries_people'
85
- end
86
- end
87
- end
88
-
89
- describe '#association_relation' do
90
- if rails_4_x?
91
- context 'when the reflection object has a #scope method' do
92
- context 'when the scope is a block' do
93
- it 'executes the block in the context of an empty scope' do
94
- define_model(:country, mood: :string)
95
- person_model = define_model(:person, country_id: :integer) do
96
- belongs_to :country, -> { where(mood: 'nice') }
97
- end
98
- delegate_reflection = person_model.reflect_on_association(:country)
99
- reflection = described_class.new(delegate_reflection)
100
-
101
- actual_sql = reflection.association_relation.to_sql
102
- expected_sql = Country.where(mood: 'nice').to_sql
103
- expect(actual_sql).to eq expected_sql
104
- end
105
- end
106
-
107
- context 'when the scope is nil' do
108
- it 'returns an empty scope' do
109
- define_model(:country)
110
- person_model = define_model(:person, country_id: :integer) do
111
- belongs_to :country
112
- end
113
- delegate_reflection = person_model.reflect_on_association(:country)
114
- reflection = described_class.new(delegate_reflection)
115
-
116
- actual_sql = reflection.association_relation.to_sql
117
- expected_sql = Country.all.to_sql
118
- expect(actual_sql).to eq expected_sql
119
- end
120
- end
121
- end
122
- end
123
-
124
- if rails_3_x?
125
- context 'when the reflection object does not have a #scope method' do
126
- context 'when the reflection options contain :conditions' do
127
- it 'creates an ActiveRecord::Relation from the conditions' do
128
- define_model(:country, mood: :string)
129
- person_model = define_model(:person, country_id: :integer) do
130
- belongs_to :country, conditions: { mood: 'nice' }
131
- end
132
- delegate_reflection = person_model.reflect_on_association(:country)
133
- reflection = described_class.new(delegate_reflection)
134
-
135
- actual_sql = reflection.association_relation.to_sql
136
- expected_sql = Country.where(mood: 'nice').to_sql
137
- expect(actual_sql).to eq expected_sql
138
- end
139
- end
140
-
141
- context 'when the reflection options contain :order' do
142
- it 'creates an ActiveRecord::Relation from the order' do
143
- define_model(:person, country_id: :integer, age: :integer)
144
- country_model = define_model(:country) do
145
- has_many :people, order: 'age'
146
- end
147
- delegate_reflection = country_model.reflect_on_association(:people)
148
- reflection = described_class.new(delegate_reflection)
149
-
150
- actual_sql = reflection.association_relation.to_sql
151
- expected_sql = Person.order('age').to_sql
152
- expect(actual_sql).to eq expected_sql
153
- end
154
- end
155
-
156
- context 'when the reflection options contain :include' do
157
- it 'creates an ActiveRecord::Relation from the include' do
158
- define_model(:city, country_id: :integer)
159
- define_model(:country) do
160
- has_many :cities
161
- end
162
- person_model = define_model(:person, country_id: :integer) do
163
- belongs_to :country, include: :cities
164
- end
165
- delegate_reflection = person_model.reflect_on_association(:country)
166
- reflection = described_class.new(delegate_reflection)
167
-
168
- actual_includes = reflection.association_relation.includes_values
169
- expected_includes = Country.includes(:cities).includes_values
170
- expect(actual_includes).to eq expected_includes
171
- end
172
- end
173
-
174
- context 'when the reflection options contain :group' do
175
- it 'creates an ActiveRecord::Relation from the group' do
176
- country_model = define_model(:country, mood: :string) do
177
- has_many :people, group: 'age'
178
- end
179
- define_model(:person, country_id: :integer, age: :integer)
180
- delegate_reflection = country_model.reflect_on_association(:people)
181
- reflection = described_class.new(delegate_reflection)
182
-
183
- actual_sql = reflection.association_relation.to_sql
184
- expected_sql = Person.group('age').to_sql
185
- expect(actual_sql).to eq expected_sql
186
- end
187
- end
188
-
189
- context 'when the reflection options contain :having' do
190
- it 'creates an ActiveRecord::Relation from the having' do
191
- country_model = define_model(:country) do
192
- has_many :people, having: 'country_id > 1'
193
- end
194
- define_model(:person, country_id: :integer)
195
- delegate_reflection = country_model.reflect_on_association(:people)
196
- reflection = described_class.new(delegate_reflection)
197
-
198
- actual_sql = reflection.association_relation.to_sql
199
- expected_sql = Person.having('country_id > 1').to_sql
200
- expect(actual_sql).to eq expected_sql
201
- end
202
- end
203
-
204
- context 'when the reflection options contain :limit' do
205
- it 'creates an ActiveRecord::Relation from the limit' do
206
- country_model = define_model(:country) do
207
- has_many :people, limit: 10
208
- end
209
- define_model(:person, country_id: :integer)
210
- delegate_reflection = country_model.reflect_on_association(:people)
211
- reflection = described_class.new(delegate_reflection)
212
-
213
- actual_sql = reflection.association_relation.to_sql
214
- expected_sql = Person.limit(10).to_sql
215
- expect(actual_sql).to eq expected_sql
216
- end
217
- end
218
-
219
- context 'when the reflection options contain :offset' do
220
- it 'creates an ActiveRecord::Relation from the offset' do
221
- country_model = define_model(:country) do
222
- has_many :people, offset: 5
223
- end
224
- define_model(:person, country_id: :integer)
225
- delegate_reflection = country_model.reflect_on_association(:people)
226
- reflection = described_class.new(delegate_reflection)
227
-
228
- actual_sql = reflection.association_relation.to_sql
229
- expected_sql = Person.offset(5).to_sql
230
- expect(actual_sql).to eq expected_sql
231
- end
232
- end
233
-
234
- context 'when the reflection options contain :select' do
235
- it 'creates an ActiveRecord::Relation from the select' do
236
- country_model = define_model(:country) do
237
- has_many :people, select: 'age'
238
- end
239
- define_model(:person, country_id: :integer, age: :integer)
240
- delegate_reflection = country_model.reflect_on_association(:people)
241
- reflection = described_class.new(delegate_reflection)
242
-
243
- actual_sql = reflection.association_relation.to_sql
244
- expected_sql = Person.select('age').to_sql
245
- expect(actual_sql).to eq expected_sql
246
- end
247
- end
248
- end
249
- end
250
- end
251
- end
@@ -1,168 +0,0 @@
1
- require "unit_spec_helper"
2
-
3
- describe Shoulda::Matchers::ActiveRecord::DefineEnumForMatcher, type: :model do
4
- if active_record_supports_enum?
5
- context 'if the attribute is given in plural form accidentally' do
6
- it 'rejects' do
7
- record = record_with_array_values
8
- plural_enum_attribute = enum_attribute.to_s.pluralize
9
- message = "Expected #{record.class} to define :#{plural_enum_attribute} as an enum and store the value in a column with an integer type"
10
-
11
- assertion = lambda do
12
- expect(record).to define_enum_for(plural_enum_attribute)
13
- end
14
-
15
- expect(&assertion).to fail_with_message(message)
16
- end
17
- end
18
-
19
- context 'if a method to hold enum values exists on the model but was not created via the enum macro' do
20
- it 'rejects' do
21
- model = define_model :example do
22
- def self.statuses; end
23
- end
24
-
25
- message = "Expected #{model} to define :statuses as an enum and store the value in a column with an integer type"
26
-
27
- assertion = lambda do
28
- expect(model.new).to define_enum_for(:statuses)
29
- end
30
-
31
- expect(&assertion).to fail_with_message(message)
32
- end
33
- end
34
-
35
- describe "with only the attribute name specified" do
36
- it "accepts a record where the attribute is defined as an enum" do
37
- expect(record_with_array_values).to define_enum_for(enum_attribute)
38
- end
39
-
40
- it "rejects a record where the attribute is not defined as an enum" do
41
- message = "Expected #{record_with_array_values.class} to define :#{non_enum_attribute} as an enum and store the value in a column with an integer type"
42
-
43
- assertion = lambda do
44
- expect(record_with_array_values).
45
- to define_enum_for(non_enum_attribute)
46
- end
47
-
48
- expect(&assertion).to fail_with_message(message)
49
- end
50
-
51
- it "rejects a record where the attribute is not defined as an enum with should not" do
52
- message = "Did not expect #{record_with_array_values.class} to define :#{enum_attribute} as an enum and store the value in a column with an integer type"
53
-
54
- assertion = lambda do
55
- expect(record_with_array_values).
56
- not_to define_enum_for(enum_attribute)
57
- end
58
-
59
- expect(&assertion).to fail_with_message(message)
60
- end
61
-
62
- context 'if the column storing the attribute is not an integer type' do
63
- it 'rejects' do
64
- record = record_with_array_values(column_type: :string)
65
- message = "Expected #{record.class} to define :statuses as an enum and store the value in a column with an integer type"
66
-
67
- assertion = lambda do
68
- expect(record).to define_enum_for(:statuses)
69
- end
70
-
71
- expect(&assertion).to fail_with_message(message)
72
- end
73
- end
74
- end
75
-
76
- describe "with both attribute name and enum values specified" do
77
- context "when the actual enum values are an array" do
78
- it "accepts a record where the attribute is defined as an enum and the enum values match" do
79
- expect(record_with_array_values).to define_enum_for(enum_attribute).
80
- with(["published", "unpublished", "draft"])
81
- end
82
-
83
- it "accepts a record where the attribute is not defined as an enum" do
84
- message = %{Expected #{record_with_array_values.class} to define :#{non_enum_attribute} as an enum with ["open", "close"] and store the value in a column with an integer type}
85
-
86
- assertion = lambda do
87
- expect(record_with_array_values).
88
- to define_enum_for(non_enum_attribute).with(['open', 'close'])
89
- end
90
-
91
- expect(&assertion).to fail_with_message(message)
92
- end
93
-
94
- it "accepts a record where the attribute is defined as an enum but the enum values do not match" do
95
- message = %{Expected #{record_with_array_values.class} to define :#{enum_attribute} as an enum with ["open", "close"] and store the value in a column with an integer type}
96
-
97
- assertion = lambda do
98
- expect(record_with_array_values).
99
- to define_enum_for(enum_attribute).
100
- with(["open", "close"])
101
- end
102
-
103
- expect(&assertion).to fail_with_message(message)
104
- end
105
- end
106
-
107
- context "when the actual enum values are a hash" do
108
- it "accepts a record where the attribute is defined as an enum and the enum values match" do
109
- expect(record_with_hash_values).to define_enum_for(enum_attribute).with(active: 0, archived: 1)
110
- end
111
-
112
- it "accepts a record where the enum values match when expected enum values are given as an array" do
113
- expect(record_with_hash_values).to define_enum_for(enum_attribute).with(["active", "archived"])
114
- end
115
-
116
- it "accepts a record where the attribute is defined as an enum but the enum values do not match" do
117
- message = %{Expected #{record_with_hash_values.class} to define :#{enum_attribute} as an enum with {:active=>5, :archived=>10} and store the value in a column with an integer type}
118
-
119
- assertion = lambda do
120
- expect(record_with_hash_values).
121
- to define_enum_for(enum_attribute).
122
- with(active: 5, archived: 10)
123
- end
124
-
125
- expect(&assertion).to fail_with_message(message)
126
- end
127
-
128
- it "rejects a record where the attribute is not defined as an enum" do
129
- message = %{Expected #{record_with_hash_values.class} to define :record_with_hash_values as an enum with {:active=>5, :archived=>10} and store the value in a column with an integer type}
130
-
131
- assertion = lambda do
132
- expect(record_with_hash_values).
133
- to define_enum_for(:record_with_hash_values).
134
- with(active: 5, archived: 10)
135
- end
136
-
137
- expect(&assertion).to fail_with_message(message)
138
- end
139
- end
140
- end
141
-
142
- def enum_attribute
143
- :status
144
- end
145
-
146
- def non_enum_attribute
147
- :condition
148
- end
149
-
150
- def record_with_array_values(column_type: :integer)
151
- model = define_model(
152
- :record_with_array_values,
153
- enum_attribute => { type: column_type },
154
- )
155
- model.enum(enum_attribute => ['published', 'unpublished', 'draft'])
156
- model.new
157
- end
158
-
159
- def record_with_hash_values
160
- model = define_model(
161
- :record_with_hash_values,
162
- enum_attribute => { type: :integer },
163
- )
164
- model.enum(enum_attribute => { active: 0, archived: 1 })
165
- model.new
166
- end
167
- end
168
- end
@@ -1,111 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveRecord::HaveDbColumnMatcher, type: :model do
4
- it 'accepts an existing database column' do
5
- expect(model(nickname: :string)).to have_db_column(:nickname)
6
- end
7
-
8
- it 'rejects a nonexistent database column' do
9
- expect(define_model(:employee).new).not_to have_db_column(:nickname)
10
- end
11
-
12
- context '#of_type' do
13
- it 'accepts a column of correct type' do
14
- expect(model(nickname: :string)).
15
- to have_db_column(:nickname).of_type(:string)
16
- end
17
-
18
- it 'rejects a nonexistent database column' do
19
- expect(define_model(:superhero).new).
20
- not_to have_db_column(:nickname).of_type(:string)
21
- end
22
-
23
- it 'rejects a column of wrong type' do
24
- expect(model(nickname: :integer)).
25
- not_to have_db_column(:nickname).of_type(:string)
26
- end
27
- end
28
-
29
- context 'with precision option' do
30
- it 'accepts a column of correct precision' do
31
- expect(with_table(:salary, :decimal, precision: 5)).
32
- to have_db_column(:salary).with_options(precision: 5)
33
- end
34
-
35
- it 'rejects a column of wrong precision' do
36
- expect(with_table(:salary, :decimal, precision: 6)).
37
- not_to have_db_column(:salary).with_options(precision: 5)
38
- end
39
- end
40
-
41
- context 'with limit option' do
42
- it 'accepts a column of correct limit' do
43
- expect(with_table(:email, :string, limit: 255)).
44
- to have_db_column(:email).with_options(limit: 255)
45
- end
46
-
47
- it 'rejects a column of wrong limit' do
48
- expect(with_table(:email, :string, limit: 100)).
49
- not_to have_db_column(:email).with_options(limit: 255)
50
- end
51
- end
52
-
53
- context 'with default option' do
54
- it 'accepts a column with correct default' do
55
- expect(with_table(:admin, :boolean, default: false)).
56
- to have_db_column(:admin).with_options(default: false)
57
- end
58
-
59
- it 'rejects a column with wrong default' do
60
- expect(with_table(:admin, :boolean, default: true)).
61
- not_to have_db_column(:admin).with_options(default: false)
62
- end
63
- end
64
-
65
- context 'with null option' do
66
- it 'accepts a column of correct null' do
67
- expect(with_table(:admin, :boolean, null: false)).
68
- to have_db_column(:admin).with_options(null: false)
69
- end
70
-
71
- it 'rejects a column of wrong null' do
72
- expect(with_table(:admin, :boolean, null: true)).
73
- not_to have_db_column(:admin).with_options(null: false)
74
- end
75
- end
76
-
77
- context 'with scale option' do
78
- it 'accepts a column of correct scale' do
79
- expect(with_table(:salary, :decimal, precision: 10, scale: 2)).
80
- to have_db_column(:salary).with_options(scale: 2)
81
- end
82
-
83
- it 'rejects a column of wrong scale' do
84
- expect(with_table(:salary, :decimal, precision: 10, scale: 4)).
85
- not_to have_db_column(:salary).with_options(scale: 2)
86
- end
87
- end
88
-
89
- context 'with primary option' do
90
- it 'accepts a column that is primary' do
91
- expect(with_table(:custom_id, :integer, primary: true)).
92
- to have_db_column(:id).with_options(primary: true)
93
- end
94
-
95
- it 'rejects a column that is not primary' do
96
- expect(with_table(:whatever, :integer, primary: false)).
97
- not_to have_db_column(:whatever).with_options(primary: true)
98
- end
99
- end
100
-
101
- def model(options = {})
102
- define_model(:employee, options).new
103
- end
104
-
105
- def with_table(column_name, column_type, options)
106
- create_table 'employees' do |table|
107
- table.__send__(column_type, column_name, options)
108
- end
109
- define_model_class('Employee').new
110
- end
111
- end
@@ -1,85 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveRecord::HaveDbIndexMatcher, type: :model do
4
- context 'have_db_index' do
5
- it 'accepts an existing index' do
6
- expect(with_index_on(:age)).to have_db_index(:age)
7
- end
8
-
9
- it 'rejects a nonexistent index' do
10
- expect(define_model(:employee).new).not_to have_db_index(:age)
11
- end
12
- end
13
-
14
- context 'have_db_index with unique option' do
15
- it 'accepts an index of correct unique' do
16
- expect(with_index_on(:ssn, unique: true)).
17
- to have_db_index(:ssn).unique(true)
18
- end
19
-
20
- it 'rejects an index of wrong unique' do
21
- expect(with_index_on(:ssn, unique: false)).
22
- not_to have_db_index(:ssn).unique(true)
23
- end
24
- end
25
-
26
- context 'have_db_index on multiple columns' do
27
- it 'accepts an existing index' do
28
- db_connection = create_table 'geocodings' do |table|
29
- table.integer :geocodable_id
30
- table.string :geocodable_type
31
- end
32
- db_connection.add_index :geocodings, [:geocodable_type, :geocodable_id]
33
- expect(define_model_class('Geocoding').new).
34
- to have_db_index([:geocodable_type, :geocodable_id])
35
- end
36
-
37
- it 'rejects a nonexistent index' do
38
- create_table 'geocodings' do |table|
39
- table.integer :geocodable_id
40
- table.string :geocodable_type
41
- end
42
- expect(define_model_class('Geocoding').new).
43
- not_to have_db_index([:geocodable_type, :geocodable_id])
44
- end
45
- end
46
-
47
- it 'join columns with and when describing multiple columns' do
48
- expect(have_db_index([:user_id, :post_id]).description).to match(/on columns user_id and post_id/)
49
- end
50
-
51
- it 'describes a unique index as unique' do
52
- expect(have_db_index(:user_id).unique(true).description).to match(/a unique index/)
53
- end
54
-
55
- it 'describes a unique index as unique when no argument is given' do
56
- expect(have_db_index(:user_id).unique.description).to match(/a unique index/)
57
- end
58
-
59
- it 'describes a non-unique index as non-unique' do
60
- expect(have_db_index(:user_id).unique(false).description).to match(/a non-unique index/)
61
- end
62
-
63
- it "does not display an index's uniqueness when it's not important" do
64
- expect(have_db_index(:user_id).description).not_to match(/unique/)
65
- end
66
-
67
- it 'allows an IndexDefinition to have a truthy value for unique' do
68
- index_definition = double(
69
- 'ActiveRecord::ConnectionAdapters::IndexDefinition',
70
- unique: 7,
71
- name: :age
72
- )
73
- matcher = have_db_index(:age).unique(true)
74
- allow(matcher).to receive(:matched_index).and_return(index_definition)
75
-
76
- expect(with_index_on(:age)).to matcher
77
- end
78
-
79
- def with_index_on(column_name, index_options = {})
80
- create_table 'employees' do |table|
81
- table.integer column_name
82
- end.add_index(:employees, column_name, index_options)
83
- define_model_class('Employee').new
84
- end
85
- end
@@ -1,41 +0,0 @@
1
- require 'unit_spec_helper'
2
-
3
- describe Shoulda::Matchers::ActiveRecord::HaveReadonlyAttributeMatcher, type: :model do
4
- context 'a read-only attribute' do
5
- it 'accepts' do
6
- expect(with_readonly_attr).to have_readonly_attribute(:attr)
7
- end
8
- end
9
-
10
- context 'an attribute that is not part of the read-only set' do
11
- it 'rejects being read-only' do
12
- model = define_model :example, attr: :string, other: :string do
13
- attr_readonly :attr
14
- end.new
15
-
16
- expect(model).not_to have_readonly_attribute(:other)
17
- end
18
- end
19
-
20
- context 'an attribute on a class with no readonly attributes' do
21
- it 'rejects being read-only' do
22
- expect(define_model(:example, attr: :string).new).
23
- not_to have_readonly_attribute(:attr)
24
- end
25
-
26
- it 'assigns a failure message' do
27
- model = define_model(:example, attr: :string).new
28
- matcher = have_readonly_attribute(:attr)
29
-
30
- matcher.matches?(model)
31
-
32
- expect(matcher.failure_message).not_to be_nil
33
- end
34
- end
35
-
36
- def with_readonly_attr
37
- define_model :example, attr: :string do
38
- attr_readonly :attr
39
- end.new
40
- end
41
- end