1
0
mirror of https://github.com/discourse/discourse.git synced 2025-03-09 14:34:35 +00:00
discourse/spec/system/emojis/emoji_deny_list_spec.rb
Alan Guo Xiang Tan e323628d8a
DEV: Speed up core system tests ()
What is the problem?

We are relying on RSpec custom matchers in system tests by defining
predicates in page objects. The problem is that this can result in a
system test unnecessarily waiting up till the full duration of
Capybara's default wait time when the RSpec custom matcher is used with
`not_to`. Considering this topic page object where we have a `has_post?`
predicate defined.

```
class Topic < PageObject
  def has_post?
    has_css?('something')
  end
end
```

The assertion `expect(Topic.new).not_to have_post` will end up waiting
the full Capybara's default wait time since the RSpec custom matcher is
calling Capybara's `has_css?` method which will wait until the selector
appear. If the selector has already disappeared by the time the
assertion is called, we end up waiting for something that will never
exists.

This commit fixes such cases by introducing new predicates that uses
the `has_no_*` versions of Capybara's node matchers.

For future reference, `to have_css` and `not_to have_css` is safe to sue
because the RSpec matcher defined by Capbyara is smart enough to call
`has_css?` or `has_no_css?` based on the expectation of the assertion.
2023-05-05 07:45:53 +08:00

103 lines
3.4 KiB
Ruby

# frozen_string_literal: true
describe "Emoji deny list", type: :system, js: true do
let(:topic_page) { PageObjects::Pages::Topic.new }
let(:composer) { PageObjects::Components::Composer.new }
let(:emoji_picker) { PageObjects::Components::EmojiPicker.new }
fab!(:admin) { Fabricate(:admin) }
before { sign_in(admin) }
describe "when editing admin settings" do
before { SiteSetting.emoji_deny_list = "" }
let(:site_settings_page) { PageObjects::Pages::AdminSettings.new }
it "should allow admin to update emoji deny list" do
site_settings_page.visit_category("posting")
site_settings_page.select_from_emoji_list("emoji_deny_list", "fu", false)
site_settings_page.select_from_emoji_list("emoji_deny_list", "poop")
expect(site_settings_page.values_in_list("emoji_deny_list")).to eq(%w[fu poop])
end
end
describe "when visiting topics" do
SiteSetting.emoji_deny_list = "monkey"
Emoji.clear_cache
fab!(:topic) { Fabricate(:topic, title: "Time for :monkey: business") }
fab!(:post) { Fabricate(:post, topic: topic, raw: "We have no time to :monkey: around!") }
it "should remove denied emojis from page title, heading and body" do
topic_page.visit_topic(topic)
expect(page.title).to eq("Time for business - Discourse")
expect(topic_page).to have_topic_title("Time for business")
expect(page).not_to have_css(".emoji[title=':monkey:']")
end
end
describe "when using composer" do
before do
SiteSetting.enable_emoji = true
SiteSetting.emoji_deny_list = "fu|poop"
Emoji.clear_cache && Discourse.request_refresh!
end
fab!(:topic) { Fabricate(:topic) }
fab!(:post) { Fabricate(:post, topic: topic) }
xit "should remove denied emojis from emoji picker" do
topic_page.visit_topic_and_open_composer(topic)
expect(composer).to be_opened
composer.click_toolbar_button("insert-emoji")
expect(composer.emoji_picker).to be_visible
expect(emoji_picker).to have_no_emoji("fu")
end
it "should not show denied emojis and aliases in emoji autocomplete" do
topic_page.visit_topic_and_open_composer(topic)
composer.type_content(":poop") # shows no results
expect(composer).to have_no_emoji_autocomplete
composer.clear_content
composer.type_content(":middle") # middle_finger is alias
expect(composer).to have_no_emoji_suggestion("fu")
end
it "should not show denied emoji in preview" do
topic_page.visit_topic_and_open_composer(topic)
composer.fill_content(":wave:")
expect(composer).to have_emoji_preview("wave")
composer.clear_content
composer.fill_content(":fu:")
expect(composer).to have_no_emoji_preview("fu")
end
end
describe "when using private messages" do
before do
SiteSetting.emoji_deny_list = "pancakes|monkey"
Emoji.clear_cache && Discourse.request_refresh!
end
fab!(:topic) do
Fabricate(:private_message_topic, title: "Want to catch up for :pancakes: today?")
end
fab!(:post) { Fabricate(:post, topic: topic, raw: "Can we use the :monkey: emoji here?") }
it "should remove denied emojis from message title and body" do
topic_page.visit_topic(topic)
expect(topic_page).to have_topic_title("Want to catch up for today?")
expect(post).not_to have_css(".emoji[title=':monkey:']")
end
end
end