From 9db96bc4a43517d1f32443c2d7a6ca1a825d1e7d Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Mon, 30 Jun 2025 22:13:42 +0200 Subject: [PATCH] Add context for search screens --- app/models/command/parser/context.rb | 28 +++++++++--- test/models/command/parser/context_test.rb | 52 ++++++++++++++++++++++ 2 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 test/models/command/parser/context_test.rb diff --git a/app/models/command/parser/context.rb b/app/models/command/parser/context.rb index a4e8b3e18..401efbd98 100644 --- a/app/models/command/parser/context.rb +++ b/app/models/command/parser/context.rb @@ -11,23 +11,21 @@ class Command::Parser::Context def cards if viewing_card_contents? user.accessible_cards.where id: params[:id] - elsif viewing_list_of_cards? + elsif viewing_cards_index? filter.cards.published + elsif viewing_search_results? + user.accessible_cards.where(id: user.search(params[:q]).select(:card_id)) else Card.none end end - def filter - user.filters.from_params(params.permit(*Filter::Params::PERMITTED_PARAMS).reverse_merge(**FilterScoped::DEFAULT_PARAMS)) - end - def viewing_card_contents? - controller == "cards" && action == "show" + viewing_card_perma? end def viewing_list_of_cards? - controller == "cards" && action == "index" + viewing_cards_index? || viewing_search_results? end private @@ -36,6 +34,22 @@ class Command::Parser::Context MAX_CARDS = 20 MAX_CLOSED_CARDS = 10 + def filter + user.filters.from_params(params.permit(*Filter::Params::PERMITTED_PARAMS).reverse_merge(**FilterScoped::DEFAULT_PARAMS)) + end + + def viewing_card_perma? + controller == "cards" && action == "show" + end + + def viewing_cards_index? + controller == "cards" && action == "index" + end + + def viewing_search_results? + controller == "searches" && action == "show" + end + def extract_url_components uri = URI.parse(url || "") route = Rails.application.routes.recognize_path(uri.path) diff --git a/test/models/command/parser/context_test.rb b/test/models/command/parser/context_test.rb new file mode 100644 index 000000000..722a38881 --- /dev/null +++ b/test/models/command/parser/context_test.rb @@ -0,0 +1,52 @@ +require "test_helper" + +class Command::Parser::ContextTest < ActiveSupport::TestCase + include Rails.application.routes.url_helpers + + setup do + @user = users(:david) + + Card.find_each(&:reindex) + Comment.find_each(&:reindex) + end + + test "viewing a single card" do + context = Command::Parser::Context.new(@user, url: card_path(cards(:layout))) + + assert context.viewing_card_contents? + assert_not context.viewing_list_of_cards? + + assert_equal 1, context.cards.count + assert_equal cards(:layout).id, context.cards.first.id + end + + test "viewing cards index" do + context = Command::Parser::Context.new(@user, url: cards_path) + + assert context.viewing_list_of_cards? + assert_not context.viewing_card_contents? + + assert_equal @user.filters.from_params(FilterScoped::DEFAULT_PARAMS).cards.published.count, context.cards.count + end + + test "viewing search results" do + context = Command::Parser::Context.new(@user, url: search_path(q: "layout")) + + assert context.viewing_list_of_cards? + assert_not context.viewing_card_contents? + + expected_cards = @user.accessible_cards.where(id: @user.search("layout").select(:card_id)) + + assert_equal expected_cards.count, context.cards.count + assert_equal expected_cards.pluck(:id).sort, context.cards.pluck(:id).sort + end + + test "unrecognized URL pattern" do + context = Command::Parser::Context.new(@user, url: filters_path) + + assert_not context.viewing_card_contents? + assert_not context.viewing_list_of_cards? + + assert_empty context.cards + end +end