diff --git a/CHANGELOG.md b/CHANGELOG.md index f941b3f..a31eb06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Unreleased +* Support overwriting scope blocks (#126) * Ruby 4.0 support (no changes required) ## 0.9.0 diff --git a/lib/has_scope.rb b/lib/has_scope.rb index 1f28f3a..c902f9d 100644 --- a/lib/has_scope.rb +++ b/lib/has_scope.rb @@ -96,6 +96,7 @@ def has_scope(*scopes, &block) options[:only] = Array(options[:only]) options[:except] = Array(options[:except]) + options[:block] = block if block self.scopes_configuration = scopes_configuration.dup diff --git a/test/has_scope_test.rb b/test/has_scope_test.rb index c61abdc..8cac678 100644 --- a/test/has_scope_test.rb +++ b/test/has_scope_test.rb @@ -76,6 +76,9 @@ def default_render class BonsaisController < TreesController has_scope :categories, if: :categories? + has_scope :content do |controller, scope| + scope.by_content('some other content') + end protected def categories? @@ -478,11 +481,6 @@ def test_scope_with_nested_hash_and_in_option assert_equal({ q: hash }, current_scopes) end - def test_overwritten_scope - assert_nil(TreesController.scopes_configuration[:categories][:if]) - assert_equal(:categories?, BonsaisController.scopes_configuration[:categories][:if]) - end - protected def mock_tree(stubs = {}) @@ -498,6 +496,38 @@ def assigns(ivar) end end +class HasScopeOverridesTest < ActionController::TestCase + tests BonsaisController + + def test_overwritten_scopes_configuration + assert_nil(TreesController.scopes_configuration[:categories][:if]) + assert_equal(:categories?, BonsaisController.scopes_configuration[:categories][:if]) + + assert_nil(TreesController.scopes_configuration[:content][:block]) + assert(BonsaisController.scopes_configuration[:content][:block]) + end + + def test_overwritten_scope_block_is_called + Tree.expects(:by_content).with('some other content').returns(Tree) + Tree.expects(:metadata_blank).with(nil).returns(Tree) + Tree.expects(:all).returns([mock_tree]) + + get :index, params: { q: { content: 'the-content' } } + + assert_equal([mock_tree], assigns(:@trees)) + end + + protected + + def mock_tree(stubs = {}) + @mock_tree ||= mock(stubs) + end + + def assigns(ivar) + @controller.instance_variable_get(ivar) + end +end + class TreeHugger include HasScope diff --git a/test/test_helper.rb b/test/test_helper.rb index e3d1ce0..4646837 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,6 +13,7 @@ HasScope::Routes = ActionDispatch::Routing::RouteSet.new HasScope::Routes.draw do resources :trees, only: %i[index new edit show] + resources :bonsais, only: %i[index] end class ApplicationController < ActionController::Base