Skip to content

Commit

Permalink
Enable configuring search_count per resource (#2930)
Browse files Browse the repository at this point in the history
* Enable configuring search_count per resource

* Replace variable with method

* Remove trailing comma

* Add tests

* Change filename

* Fix lint error
  • Loading branch information
binarygit authored Jul 9, 2024
1 parent 9e339e3 commit eb0260d
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
13 changes: 12 additions & 1 deletion app/controllers/avo/search_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def search_resource(resource)
results_count = query.reselect(resource.model_class.primary_key).count

# Get the results
query = query.limit(Avo.configuration.search_results_count)
query = query.limit(search_results_count(resource))

results = apply_search_metadata(query, resource)

Expand Down Expand Up @@ -201,5 +201,16 @@ def render_search_error(error)
}
}, status: 500
end

def search_results_count(resource)
if resource.search_results_count
Avo::ExecutionContext.new(
target: resource.search_results_count,
params: params
).handle
else
Avo.configuration.search_results_count
end
end
end
end
4 changes: 4 additions & 0 deletions lib/avo/base_resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,10 @@ def search_query
search.dig(:query)
end

def search_results_count
search.dig(:results_count)
end

def fetch_search(key, record: nil)
# self.class.fetch_search
Avo::ExecutionContext.new(target: search[key], resource: self, record: record).handle
Expand Down
72 changes: 72 additions & 0 deletions spec/features/avo/search_results_count_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# frozen_string_literal: true

require "rails_helper"

RSpec.feature Avo::SearchController, type: :controller do
let!(:courses) do
create_list(:course, 10) do |course, idx|
course.name = "course_#{idx + 1}"
course.save!
end
end

context "When results_count is not set in the resource" do
it "Returns 8 results by default" do
get :show, params: {
resource_name: "course",
global: false,
q: "course"
}

expect(json["courses"]["count"]).to eq 8
end
end

context "When results_count is changed in a per resource basis" do
after(:example) do
Avo::Resources::Course.search[:results_count] = nil
end

it "Return 5 when configured" do
Avo::Resources::Course.search[:results_count] = 5
get :show, params: {
resource_name: "course",
global: false,
q: "course"
}

expect(json["courses"]["count"]).to eq 5
end

it "Return 2 when configured" do
Avo::Resources::Course.search[:results_count] = 2
get :show, params: {
resource_name: "course",
global: false,
q: "course"
}

expect(json["courses"]["count"]).to eq 2
end

let!(:post) { create :post, name: "Avi's masterclass" }

it "is configurable per resource" do
Avo::Resources::Post.search[:results_count] = 0
get :show, params: {
resource_name: "post",
global: false,
q: "class"
}

expect(json["posts"]["count"]).to eq 0

res = get :show, params: {
resource_name: "course",
global: false,
q: "course"
}
expect(JSON.parse(res.body)["courses"]["count"]).to eq 8
end
end
end

0 comments on commit eb0260d

Please sign in to comment.