From f7a1272fa48f2d3dd36668757b1b4e07013a3f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 29 Apr 2024 15:56:52 +0200 Subject: [PATCH] DEV: cleanup custom filters to prevent leaks Ensures we clean up any custom filters added in the specs to prevent any leaks when running the specs. Follow up to https://github.com/discourse/discourse/pull/26770#discussion_r1582464760 --- lib/search.rb | 8 ++++---- lib/topic_view.rb | 5 ++--- lib/topics_filter.rb | 4 ++-- spec/lib/search_spec.rb | 7 +++++++ spec/lib/topic_view_spec.rb | 4 ++-- spec/lib/topics_filter_spec.rb | 2 ++ spec/requests/topics_controller_spec.rb | 5 +++-- 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/search.rb b/lib/search.rb index 557a2bb6c88..1a388870243 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -349,19 +349,19 @@ class Search end def self.advanced_order(trigger, &block) - (@advanced_orders ||= {})[trigger] = block + advanced_orders[trigger] = block end def self.advanced_orders - @advanced_orders + @advanced_orders ||= {} end def self.advanced_filter(trigger, &block) - (@advanced_filters ||= {})[trigger] = block + advanced_filters[trigger] = block end def self.advanced_filters - @advanced_filters + @advanced_filters ||= {} end def self.custom_topic_eager_load(tables = nil, &block) diff --git a/lib/topic_view.rb b/lib/topic_view.rb index b59ba0f1543..ce221e50d24 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -73,12 +73,11 @@ class TopicView end def self.add_custom_filter(key, &blk) - @custom_filters ||= {} - @custom_filters[key] = blk + custom_filters[key] = blk end def self.custom_filters - @custom_filters || {} + @custom_filters ||= {} end # Configure a default scope to be applied to @filtered_posts. diff --git a/lib/topics_filter.rb b/lib/topics_filter.rb index 4d075d53ac0..e1cefed5112 100644 --- a/lib/topics_filter.rb +++ b/lib/topics_filter.rb @@ -87,11 +87,11 @@ class TopicsFilter end def self.add_filter_by_status(status, &blk) - (@custom_status_filters ||= {})[status] = blk + custom_status_filters[status] = blk end def self.custom_status_filters - @custom_status_filters || {} + @custom_status_filters ||= {} end def filter_status(status:, category_id: nil) diff --git a/spec/lib/search_spec.rb b/spec/lib/search_spec.rb index 3e8d9d592fd..79f18740124 100644 --- a/spec/lib/search_spec.rb +++ b/spec/lib/search_spec.rb @@ -2635,11 +2635,18 @@ RSpec.describe Search do end let!(:post1) { Fabricate(:post, raw: "this is the second post about advanced filter") } + after do + Search.advanced_filters.clear + Search.advanced_orders.clear + end + it "allows to define custom filter" do expect(Search.new("advanced").execute.posts).to eq([post1, post0]) + Search.advanced_filter(/^min_chars:(\d+)$/) do |posts, match| posts.where("(SELECT LENGTH(p2.raw) FROM posts p2 WHERE p2.id = posts.id) >= ?", match.to_i) end + expect(Search.new("advanced min_chars:50").execute.posts).to eq([post0]) end diff --git a/spec/lib/topic_view_spec.rb b/spec/lib/topic_view_spec.rb index cdc67944f55..15660e0e08d 100644 --- a/spec/lib/topic_view_spec.rb +++ b/spec/lib/topic_view_spec.rb @@ -72,6 +72,8 @@ RSpec.describe TopicView do fab!(:p0) { Fabricate(:post, topic: topic) } fab!(:p1) { Fabricate(:post, topic: topic, wiki: true) } + after { TopicView.custom_filters.clear } + it "allows to register custom filters" do tv = TopicView.new(topic.id, evil_trout, { filter: "wiki" }) expect(tv.filter_posts({ filter: "wiki" })).to eq([p0, p1]) @@ -83,8 +85,6 @@ RSpec.describe TopicView do tv = TopicView.new(topic.id, evil_trout, { filter: "whatever" }) expect(tv.filter_posts).to eq([p0, p1]) - ensure - TopicView.instance_variable_set(:@custom_filters, {}) end end diff --git a/spec/lib/topics_filter_spec.rb b/spec/lib/topics_filter_spec.rb index 64247ba74a5..1ba3e496e57 100644 --- a/spec/lib/topics_filter_spec.rb +++ b/spec/lib/topics_filter_spec.rb @@ -619,6 +619,8 @@ RSpec.describe TopicsFilter do fab!(:deleted_topic_id) { Fabricate(:topic, deleted_at: Time.zone.now).id } fab!(:foobar_topic) { Fabricate(:topic, closed: true, word_count: 42) } + after { TopicsFilter.custom_status_filters.clear } + it "supports custom status filters" do TopicsFilter.add_filter_by_status("foobar") { |scope| scope.where("word_count = 42") } diff --git a/spec/requests/topics_controller_spec.rb b/spec/requests/topics_controller_spec.rb index 9c1c3d1bc2b..a2afd121fec 100644 --- a/spec/requests/topics_controller_spec.rb +++ b/spec/requests/topics_controller_spec.rb @@ -3336,6 +3336,9 @@ RSpec.describe TopicsController do describe "custom filters" do fab!(:post2) { Fabricate(:post, user: post_author2, topic: topic, percent_rank: 0.2) } fab!(:post3) { Fabricate(:post, user: post_author3, topic: topic, percent_rank: 0.5) } + + after { TopicView.custom_filters.clear } + it "should return the right posts" do TopicView.add_custom_filter("percent") do |posts, topic_view| posts.where(percent_rank: 0.5) @@ -3348,8 +3351,6 @@ RSpec.describe TopicsController do body = response.parsed_body expect(body["post_stream"]["posts"].map { |p| p["id"] }).to eq([post3.id]) - ensure - TopicView.instance_variable_set(:@custom_filters, {}) end end end