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.
- checksums.yaml +5 -5
- data/{MIT-LICENSE → LICENSE} +1 -1
- data/README.md +407 -232
- data/docs/errors/NonCaseSwappableValueError.md +2 -2
- data/lib/shoulda/matchers/action_controller/callback_matcher.rb +7 -80
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +4 -3
- data/lib/shoulda/matchers/action_controller/flash_store.rb +2 -4
- data/lib/shoulda/matchers/action_controller/permit_matcher.rb +36 -30
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +8 -10
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +7 -9
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +18 -15
- data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +3 -2
- data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +3 -3
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +88 -29
- data/lib/shoulda/matchers/action_controller/route_params.rb +2 -2
- data/lib/shoulda/matchers/action_controller/set_flash_matcher.rb +4 -4
- data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -3
- data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +19 -13
- data/lib/shoulda/matchers/action_controller.rb +2 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +5 -9
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +2 -2
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +42 -39
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +52 -26
- data/lib/shoulda/matchers/active_model/helpers.rb +2 -2
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -30
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +2 -1
- data/lib/shoulda/matchers/active_model/qualifiers/allow_blank.rb +26 -0
- data/lib/shoulda/matchers/active_model/qualifiers/allow_nil.rb +26 -0
- data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +1 -1
- data/lib/shoulda/matchers/active_model/qualifiers.rb +2 -0
- data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +30 -6
- data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +8 -3
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +31 -16
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +52 -16
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +137 -84
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +159 -46
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +130 -66
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +251 -24
- data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +12 -9
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +38 -6
- data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -4
- data/lib/shoulda/matchers/active_model/validator.rb +4 -9
- data/lib/shoulda/matchers/active_model.rb +3 -5
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +10 -7
- data/lib/shoulda/matchers/active_record/association_matcher.rb +386 -111
- data/lib/shoulda/matchers/active_record/association_matchers/counter_cache_matcher.rb +5 -2
- data/lib/shoulda/matchers/active_record/association_matchers/dependent_matcher.rb +4 -4
- data/lib/shoulda/matchers/active_record/association_matchers/inverse_of_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/association_matchers/join_table_matcher.rb +11 -6
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +14 -15
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +30 -8
- data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +34 -11
- data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +69 -0
- data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +74 -0
- data/lib/shoulda/matchers/active_record/association_matchers/source_matcher.rb +3 -2
- data/lib/shoulda/matchers/active_record/association_matchers/through_matcher.rb +7 -5
- data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +458 -42
- data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +185 -0
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +63 -23
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +164 -48
- data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +106 -0
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +13 -11
- data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +83 -0
- data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +132 -0
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +18 -18
- data/lib/shoulda/matchers/active_record/uniqueness/test_model_creator.rb +1 -3
- data/lib/shoulda/matchers/active_record/uniqueness/test_models.rb +0 -2
- data/lib/shoulda/matchers/active_record/uniqueness.rb +1 -1
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +430 -200
- data/lib/shoulda/matchers/active_record.rb +28 -20
- data/lib/shoulda/matchers/configuration.rb +12 -1
- data/lib/shoulda/matchers/doublespeak/double.rb +1 -1
- data/lib/shoulda/matchers/doublespeak/double_collection.rb +3 -3
- data/lib/shoulda/matchers/doublespeak/double_implementation_registry.rb +8 -5
- data/lib/shoulda/matchers/doublespeak/object_double.rb +6 -2
- data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +1 -5
- data/lib/shoulda/matchers/doublespeak/world.rb +2 -2
- data/lib/shoulda/matchers/doublespeak.rb +2 -1
- data/lib/shoulda/matchers/error.rb +1 -1
- data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +109 -29
- data/lib/shoulda/matchers/independent.rb +2 -2
- data/lib/shoulda/matchers/integrations/configuration.rb +8 -4
- data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/rails.rb +2 -2
- data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +1 -1
- data/lib/shoulda/matchers/rails_shim.rb +172 -51
- data/lib/shoulda/matchers/routing.rb +2 -2
- data/lib/shoulda/matchers/util/word_wrap.rb +17 -12
- data/lib/shoulda/matchers/util.rb +39 -5
- data/lib/shoulda/matchers/version.rb +1 -1
- data/lib/shoulda/matchers/warn.rb +4 -3
- data/shoulda-matchers.gemspec +33 -15
- metadata +31 -338
- data/.gitignore +0 -12
- data/.hound.yml +0 -3
- data/.hound_config/ruby.yml +0 -12
- data/.travis.yml +0 -19
- data/.yardopts +0 -10
- data/Appraisals +0 -73
- data/CONTRIBUTING.md +0 -101
- data/Gemfile +0 -15
- data/Gemfile.lock +0 -70
- data/NEWS.md +0 -986
- data/Rakefile +0 -39
- data/custom_plan.rb +0 -88
- data/doc_config/gh-pages/index.html.erb +0 -9
- data/doc_config/yard/setup.rb +0 -22
- data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +0 -5967
- data/doc_config/yard/templates/default/fulldoc/html/css/full_list.css +0 -12
- data/doc_config/yard/templates/default/fulldoc/html/css/global.css +0 -62
- data/doc_config/yard/templates/default/fulldoc/html/css/solarized.css +0 -69
- data/doc_config/yard/templates/default/fulldoc/html/css/style.css +0 -312
- data/doc_config/yard/templates/default/fulldoc/html/full_list.erb +0 -32
- data/doc_config/yard/templates/default/fulldoc/html/full_list_class.erb +0 -1
- data/doc_config/yard/templates/default/fulldoc/html/full_list_method.erb +0 -8
- data/doc_config/yard/templates/default/fulldoc/html/js/app.js +0 -298
- data/doc_config/yard/templates/default/fulldoc/html/js/full_list.js +0 -1
- data/doc_config/yard/templates/default/fulldoc/html/js/jquery.stickyheaders.js +0 -289
- data/doc_config/yard/templates/default/fulldoc/html/js/underscore.min.js +0 -6
- data/doc_config/yard/templates/default/fulldoc/html/setup.rb +0 -8
- data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +0 -14
- data/doc_config/yard/templates/default/layout/html/fonts.erb +0 -1
- data/doc_config/yard/templates/default/layout/html/footer.erb +0 -6
- data/doc_config/yard/templates/default/layout/html/layout.erb +0 -23
- data/doc_config/yard/templates/default/layout/html/search.erb +0 -13
- data/doc_config/yard/templates/default/layout/html/setup.rb +0 -40
- data/doc_config/yard/templates/default/method_details/html/source.erb +0 -10
- data/doc_config/yard/templates/default/module/html/box_info.erb +0 -31
- data/gemfiles/4.0.0.gemfile +0 -38
- data/gemfiles/4.0.0.gemfile.lock +0 -223
- data/gemfiles/4.0.1.gemfile +0 -38
- data/gemfiles/4.0.1.gemfile.lock +0 -225
- data/gemfiles/4.1.gemfile +0 -38
- data/gemfiles/4.1.gemfile.lock +0 -220
- data/gemfiles/4.2.gemfile +0 -38
- data/gemfiles/4.2.gemfile.lock +0 -243
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +0 -159
- data/lib/shoulda/matchers/independent/delegate_method_matcher/stubbed_target.rb +0 -37
- data/script/SUPPORTED_VERSIONS +0 -1
- data/script/install_gems_in_all_appraisals +0 -14
- data/script/run_all_tests +0 -14
- data/script/update_gem_in_all_appraisals +0 -15
- data/script/update_gems_in_all_appraisals +0 -14
- data/spec/acceptance/active_model_integration_spec.rb +0 -23
- data/spec/acceptance/independent_matchers_spec.rb +0 -125
- data/spec/acceptance/multiple_libraries_integration_spec.rb +0 -55
- data/spec/acceptance/rails_integration_spec.rb +0 -156
- data/spec/acceptance_spec_helper.rb +0 -23
- data/spec/doublespeak_spec_helper.rb +0 -2
- data/spec/report_warnings.rb +0 -7
- data/spec/spec_helper.rb +0 -21
- data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +0 -133
- data/spec/support/acceptance/helpers/active_model_helpers.rb +0 -11
- data/spec/support/acceptance/helpers/array_helpers.rb +0 -13
- data/spec/support/acceptance/helpers/base_helpers.rb +0 -19
- data/spec/support/acceptance/helpers/command_helpers.rb +0 -55
- data/spec/support/acceptance/helpers/file_helpers.rb +0 -19
- data/spec/support/acceptance/helpers/gem_helpers.rb +0 -31
- data/spec/support/acceptance/helpers/minitest_helpers.rb +0 -11
- data/spec/support/acceptance/helpers/n_unit_helpers.rb +0 -25
- data/spec/support/acceptance/helpers/pluralization_helpers.rb +0 -13
- data/spec/support/acceptance/helpers/rails_version_helpers.rb +0 -11
- data/spec/support/acceptance/helpers/rspec_helpers.rb +0 -24
- data/spec/support/acceptance/helpers/ruby_version_helpers.rb +0 -9
- data/spec/support/acceptance/helpers/step_helpers.rb +0 -127
- data/spec/support/acceptance/helpers.rb +0 -31
- data/spec/support/acceptance/matchers/have_output.rb +0 -31
- data/spec/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +0 -55
- data/spec/support/acceptance/matchers/indicate_that_tests_were_run_matcher.rb +0 -103
- data/spec/support/tests/bundle.rb +0 -94
- data/spec/support/tests/command_runner.rb +0 -230
- data/spec/support/tests/current_bundle.rb +0 -61
- data/spec/support/tests/database.rb +0 -28
- data/spec/support/tests/database_adapters/postgresql.rb +0 -25
- data/spec/support/tests/database_adapters/sqlite3.rb +0 -26
- data/spec/support/tests/database_configuration.rb +0 -33
- data/spec/support/tests/database_configuration_registry.rb +0 -28
- data/spec/support/tests/filesystem.rb +0 -100
- data/spec/support/tests/version.rb +0 -45
- data/spec/support/unit/active_record/create_table.rb +0 -54
- data/spec/support/unit/attribute.rb +0 -47
- data/spec/support/unit/capture.rb +0 -40
- data/spec/support/unit/change_value.rb +0 -111
- data/spec/support/unit/create_model_arguments/basic.rb +0 -135
- data/spec/support/unit/create_model_arguments/has_many.rb +0 -15
- data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +0 -74
- data/spec/support/unit/helpers/active_model_helpers.rb +0 -27
- data/spec/support/unit/helpers/active_model_versions.rb +0 -28
- data/spec/support/unit/helpers/active_record_versions.rb +0 -24
- data/spec/support/unit/helpers/active_resource_builder.rb +0 -27
- data/spec/support/unit/helpers/allow_value_matcher_helpers.rb +0 -15
- data/spec/support/unit/helpers/class_builder.rb +0 -90
- data/spec/support/unit/helpers/column_type_helpers.rb +0 -26
- data/spec/support/unit/helpers/confirmation_matcher_helpers.rb +0 -17
- data/spec/support/unit/helpers/controller_builder.rb +0 -63
- data/spec/support/unit/helpers/database_helpers.rb +0 -20
- data/spec/support/unit/helpers/i18n_faker.rb +0 -15
- data/spec/support/unit/helpers/mailer_builder.rb +0 -12
- data/spec/support/unit/helpers/model_builder.rb +0 -114
- data/spec/support/unit/helpers/rails_versions.rb +0 -28
- data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +0 -44
- data/spec/support/unit/i18n.rb +0 -7
- data/spec/support/unit/load_environment.rb +0 -12
- data/spec/support/unit/matchers/deprecate.rb +0 -60
- data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +0 -51
- data/spec/support/unit/matchers/fail_with_message_matcher.rb +0 -62
- data/spec/support/unit/matchers/print_warning_including.rb +0 -59
- data/spec/support/unit/model_creation_strategies/active_model.rb +0 -111
- data/spec/support/unit/model_creation_strategies/active_record.rb +0 -77
- data/spec/support/unit/model_creators/active_model.rb +0 -39
- data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +0 -95
- data/spec/support/unit/model_creators/active_record/has_many.rb +0 -67
- data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +0 -42
- data/spec/support/unit/model_creators/active_record.rb +0 -43
- data/spec/support/unit/model_creators/basic.rb +0 -97
- data/spec/support/unit/model_creators.rb +0 -19
- data/spec/support/unit/rails_application.rb +0 -126
- data/spec/support/unit/record_builder_with_i18n_validation_message.rb +0 -69
- data/spec/support/unit/record_validating_confirmation_builder.rb +0 -51
- data/spec/support/unit/record_with_different_error_attribute_builder.rb +0 -92
- data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +0 -79
- data/spec/support/unit/shared_examples/numerical_submatcher.rb +0 -17
- data/spec/support/unit/shared_examples/set_session_or_flash.rb +0 -360
- data/spec/support/unit/validation_matcher_scenario.rb +0 -62
- data/spec/unit/shoulda/matchers/action_controller/callback_matcher_spec.rb +0 -82
- data/spec/unit/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +0 -28
- data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +0 -592
- data/spec/unit/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +0 -42
- data/spec/unit/shoulda/matchers/action_controller/render_template_matcher_spec.rb +0 -76
- data/spec/unit/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +0 -62
- data/spec/unit/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +0 -90
- data/spec/unit/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +0 -31
- data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +0 -330
- data/spec/unit/shoulda/matchers/action_controller/route_params_spec.rb +0 -30
- data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +0 -67
- data/spec/unit/shoulda/matchers/action_controller/set_session_matcher_spec.rb +0 -17
- data/spec/unit/shoulda/matchers/action_controller/set_session_or_flash_matcher_spec.rb +0 -562
- data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
- data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +0 -823
- data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +0 -86
- data/spec/unit/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +0 -20
- data/spec/unit/shoulda/matchers/active_model/helpers_spec.rb +0 -162
- data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +0 -266
- data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +0 -91
- data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +0 -149
- data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +0 -207
- data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +0 -1015
- data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +0 -288
- data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +0 -1837
- data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +0 -380
- data/spec/unit/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -107
- data/spec/unit/shoulda/matchers/active_record/association_matcher_spec.rb +0 -1242
- data/spec/unit/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +0 -251
- data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +0 -168
- data/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +0 -111
- data/spec/unit/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +0 -85
- data/spec/unit/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +0 -41
- data/spec/unit/shoulda/matchers/active_record/serialize_matcher_spec.rb +0 -86
- data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +0 -1418
- data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +0 -190
- data/spec/unit/shoulda/matchers/doublespeak/double_implementation_registry_spec.rb +0 -21
- data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +0 -271
- data/spec/unit/shoulda/matchers/doublespeak/object_double_spec.rb +0 -77
- data/spec/unit/shoulda/matchers/doublespeak/proxy_implementation_spec.rb +0 -72
- data/spec/unit/shoulda/matchers/doublespeak/stub_implementation_spec.rb +0 -101
- data/spec/unit/shoulda/matchers/doublespeak/world_spec.rb +0 -80
- data/spec/unit/shoulda/matchers/doublespeak_spec.rb +0 -27
- data/spec/unit/shoulda/matchers/independent/delegate_method_matcher/stubbed_target_spec.rb +0 -43
- data/spec/unit/shoulda/matchers/independent/delegate_method_matcher_spec.rb +0 -517
- data/spec/unit/shoulda/matchers/routing/route_matcher_spec.rb +0 -242
- data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +0 -252
- data/spec/unit_spec_helper.rb +0 -46
- data/spec/warnings_spy/filesystem.rb +0 -45
- data/spec/warnings_spy/partitioner.rb +0 -36
- data/spec/warnings_spy/reader.rb +0 -53
- data/spec/warnings_spy/reporter.rb +0 -88
- data/spec/warnings_spy.rb +0 -64
- data/tasks/documentation.rb +0 -199
- 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
|